登录
首页 >  Golang >  Go问答

使用反射动态创建类型并传递引用的方法虽能编译通过,但并不生效

来源:stackoverflow

时间:2024-03-19 20:36:30 153浏览 收藏

在 Go 中,使用反射动态创建类型并传递其引用进行解码时,尽管编译通过,但不会生效。原因是 reflect.New() 返回一个指向所创建类型值的指针,但它被包装在 reflect.Value 结构中。要正确传递引用,需要使用 Value.Interface() 将指针“解开”为 interface{},然后才能将其传递给解码函数。

问题内容

当我动态创建一个指向类型的指针,然后将其传递给解组函数时,理论上它似乎是正确编写的:

x := reflect.new(structtype)
decode(x)

但是,当您打印 x 时,它看起来像是该类型的零值。该类型绝对正确且符合预期。

另一方面,当我创建类型并直接向它传递指针时,它工作得很好:

directoryEntry := DirectoryEntry{}
decode(&directoryEntry)

内容由 decode() 正确设置,并且打印时是正确的。

所以,看来我必须将类型的值传递给 decode() 而不是引用?

有人可以指出我必须缺少什么吗?一些 google 查询没有帮助,看来我一定遗漏了一些小东西。


解决方案


reflect.New() 返回一个指向所传递类型值的指针,但返回的指针包装在 reflect.Value 结构中!

使用 Value.Interface() “解开”它,并获得一个指针作为 interface{},您可以将其传递给 decode()

x := reflect.New(structType)
p := x.Interface()
decode(p)

当您打印 reflect.value 时,您通常不会看到差异,因为 reflect.value 类型被特殊对待;引用自Value.String()

fmt 包特别对待值。它不会隐式调用它们的 string 方法,而是打印它们所保存的具体值。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>