这两个函数/方法都返回一个Value,并且根据go doc的说明:
ValueOf返回一个新的Value,该值初始化为存储在接口i中的具体值。ValueOf(nil)返回零值。
Elem返回接口v包含或指针v指向的值。如果v的类型不是Interface或Ptr,则会引发panic。如果v为nil,则返回零值。
我从stackoverflow上的一篇文章中找到了这段代码,但仍然不明白何时使用.Elem()。
func SetField(obj interface{}, name string, value interface{}) error {
// won't work if I remove .Elem()
structValue := reflect.ValueOf(obj).Elem()
structFieldValue := structValue.FieldByName(name)
if !structFieldValue.IsValid() {
return fmt.Errorf("No such field: %s in obj", name)
}
if !structFieldValue.CanSet() {
return fmt.Errorf("Cannot set %s field value", name)
}
structFieldType := structFieldValue.Type()
// won't work either if I add .Elem() to the end
val := reflect.ValueOf(value)
if structFieldType != val.Type() {
return fmt.Errorf("Provided value %v type %v didn't match obj field type %v",val,val.Type(),structFieldType)
}
structFieldValue.Set(val)
return nil
}
int
类型的i
变量和一个指向i
的指针变量p
,其类型为指向int
类型的指针。 如果你在p
的reflect.Value
上调用Elem()
,你会得到一个reflect.Value
,这与你在第一次调用reflect.ValueOf()
时得到的结果相同。 - icza