小编ste*_*140的帖子

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

几天前我开始学习 golang,发现reflect.Valueof()Value.Elem()很混乱。这两个函数/方法有什么区别以及如何正确使用它们?

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

ValueOf 返回一个初始化为接口 i 中存储的具体值的新值。ValueOf(nil) 返回零值。

Elem 返回接口 v 包含的值或指针 v 指向的值。如果 v 的 Kind 不是 Interface 或 Ptr,它会发生恐慌。如果 v 为零,则返回零值。

我从 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 := …
Run Code Online (Sandbox Code Playgroud)

reflection pointers interface go

0
推荐指数
1
解决办法
5512
查看次数

标签 统计

go ×1

interface ×1

pointers ×1

reflection ×1