Golang中反射包中的Elem和Indirect有什么区别?

21

来自文档

func (v Value) Elem() Value

Elem函数返回接口v或指针v所指向的值。如果v的类型不是Interface或Ptr,则会引发panic。如果v为nil,则返回零值。

func Indirect(v Value) Value
Indirect函数返回v指向的值。如果v是空指针,Indirect函数返回零值。如果v不是指针,则Indirect函数返回v本身。

那么我可以安全地假设以下情况吗?

reflect.Indirect(reflect.ValueOf(someX)) === reflect.ValueOf(someX).Elem().

间接法只是上述右侧的一种方便方法吗?


如果您知道答案,我有一个跟进问题:https://stackoverflow.com/questions/52132517/golang-v-elem-vs-indirectv-when-passing-in-result-of-a-reflect-newtype - John
1个回答

26
如果一个reflect.Value是指针, 那么v.Elem()等同于reflect.Indirect(v). 如果它不是指针,则它们不等价: - 如果值是接口,则reflect.Indirect(v)会返回相同的值,而v.Elem()会返回包含的动态值。 - 如果值是其他类型,则v.Elem()将触发panic。 reflect.Indirect助手旨在处理您想要接受某个特定类型或该类型的指针的情况。一个例子是database/sql转换例程:通过使用reflect.Indirect,它可以使用相同的代码路径来处理各种类型和指向这些类型的指针。

如果您知道答案,我有一个跟进问题:https://stackoverflow.com/questions/52132517/golang-v-elem-vs-indirectv-when-passing-in-result-of-a-reflect-newtype - John

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接