作为示例,我可以从界面工作中获取其基础类型的零值吗?
func MakeSomething(w Worker){
w.Work()
//can I get a zeor value type of The type underlying w?
//I tried as followed, but failed
copy :=w
v := reflect.ValueOf(©)
fm :=v.Elem()
modified :=reflect.Zero(fm.Type())//fm.type is Worker, and modified comes to be nil
fm.Set(modified)
fmt.Println(copy)
}
type Worker interface {
Work()
}
答案 0 :(得分:2)
由于w
包含指向Worker
的指针,因此您可能希望获得指向的元素的零值。获得元素后,您可以创建其类型的零值:
v := reflect.ValueOf(w).Elem() // Get the element pointed to
zero := reflect.Zero(v.Type()) // Create the zero value
如果您将非指针传递给MakeSomething
,则上面的代码段会发生混乱。为防止出现这种情况,您可能需要执行以下操作:
v := reflect.ValueOf(w)
if reflect.TypeOf(w).Kind() == reflect.Ptr {
v = v.Elem()
}
zero := reflect.Zero(v.Type())
如果您确实希望获得指向新Worker
的指针,只需将reflect.Zero(v.Type())
替换为reflect.New(v.Type())
。