一尘不染

golang-反射包中的Elem Vs Indirect

go

来自文档

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().

间接方法仅仅是上述方法的一种便捷方法吗?


阅读 1380

收藏
2020-07-02

共1个答案

一尘不染

如果a reflect.Value是指针,则v.Elem()等效于reflect.Indirect(v)。如果不是指针,则它们不是等效的:

  • 如果该值是接口,reflect.Indirect(v)则将返回相同的值,而v.Elem()将返回所包含的动态值。
  • 如果该值是其他值,则将感到v.Elem()恐慌。

reflect.Indirect助手用于需要接受特定类型或指向该类型的指针的情况。一个示例是database/sql转换例程:通过使用reflect.Indirect,它可以使用相同的代码路径来处理各种类型和指向这些类型的指针。

2020-07-02