dongshang1979
2019-08-07 07:02
浏览 2.9k
已采纳

go中的reflect.ValueOf()和Value.Elem()有什么区别?

I started learning golang a couple of days ago and found reflect.Valueof() and Value.Elem() quite confusing. What is the difference between this two function/methods and how to use them correctly?

Both function/methods return a Value, and according to the go doc

ValueOf returns a new Value initialized to the concrete value stored in the interface i. ValueOf(nil) returns the zero Value.

Elem returns the value that the interface v contains or that the pointer v points to. It panics if v's Kind is not Interface or Ptr. It returns the zero Value if v is nil.

I found this code from a post on stackoverflow but still don't understand when to use .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
}

图片转代码服务由CSDN问答提供 功能建议

几天前,我开始学习golang并发现 reflect.Valueof() Value.Elem()非常令人困惑。 这两个函数/方法之间的区别是什么以及如何正确使用它们?</ p>

两个函数/方法都返回一个值,并根据go doc </ p>

ValueOf返回一个新的Value,该初始值初始化为接口i中存储的具体值。 ValueOf(nil)返回零值。</ p>

Elem返回接口v包含的值或指针v指向的值。 如果v的种类不是Interface或Ptr,它会感到恐慌。 如果v为零,它将返回零值。</ p> </ blockquote>

我从stackoverflow上的帖子中找到了此代码,但仍然不知道何时使用.Elem()< / p>

  func SetField(obj interface {},name string,value interface {})错误{
 
 //不会 如果我删除.Elem()
 structValue:= reflect.ValueOf(obj).Elem()
 
 structFieldValue:= structValue.FieldByName(name)
 
如果!structFieldValue.IsValid(){
 返回fmt.Errorf(“没有这样的字段:obj中的%s”,名称)
} 
 
,如果!structFieldValue.CanSet(){
返回fmt.Errorf(“无法设置%s字段值”,名称 )
} 
 
 structFieldType:= structFieldValue.Type()
 
 //如果将.Elem()添加到末尾也将不起作用
 val:= reflect.ValueOf(value)
 如果structFieldType!= val.Type(){
 
返回fmt.Errorf(“提供的值%v类型%v与obj字段类型%v不匹配”,val,val.Type(),structFieldType)
  } 
 
 structFieldValue.Set(val)
恢复 rn nil 
} 
 </ code> </ pre> 
 </ div>

1条回答 默认 最新

相关推荐 更多相似问题