golang-反射包中的Elem Vs Indirect
来自文档
func (v Value) Elem() Value
Elem返回接口v包含的值或指针v指向的值。 如果v的种类不是Interface或Ptr,它会感到恐慌。如果v为零,它将返回零值。
func Indirect(v Value) Value
间接返回v指向的值。 如果v是nil指针,则Indirect返回零值。如果v不是指针,则Indirect返回v。
那么我可以安全地假设以下情况吗?
reflect.Indirect(reflect.ValueOf(someX)) === reflect.ValueOf(someX).Elem().
间接方法仅仅是上述方法的一种便捷方法吗?
回答:
如果a reflect.Value
是指针,则v.Elem()
等效于reflect.Indirect(v)
。如果不是指针,则它们不是等效的:
- 如果该值是接口,
reflect.Indirect(v)
则将返回相同的值,而v.Elem()
将返回所包含的动态值。 - 如果该值是其他值,则将感到
v.Elem()
恐慌。
该reflect.Indirect
助手用于需要接受特定类型或指向该类型的指针的情况。一个示例是database/sql
转换例程:通过使用reflect.Indirect
,它可以使用相同的代码路径来处理各种类型和指向这些类型的指针。
以上是 golang-反射包中的Elem Vs Indirect 的全部内容, 来源链接: utcz.com/qa/433899.html