golang - 反射包中的Elem Vs Indirect

sat*_*sat 17 go

来自文档

func (v Value) Elem() Value
Run Code Online (Sandbox Code Playgroud)

Elem返回接口v包含的值或指针v指向的值.如果v的种类不是接口或Ptr,它会引起恐慌.如果v为nil,则返回零值.

func Indirect(v Value) Value
Run Code Online (Sandbox Code Playgroud)

间接返回v指向的值.如果v是nil指针,则Indirect返回零值.如果v不是指针,则间接返回v.

那么我可以安全地假设以下内容吗?

reflect.Indirect(reflect.ValueOf(someX)) === reflect.ValueOf(someX).Elem().
Run Code Online (Sandbox Code Playgroud)

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

Jam*_*dge 18

如果a reflect.Value是指针,则v.Elem()相当于reflect.Indirect(v).如果它不是指针,那么它们不是等价的:

  • 如果值是接口,则reflect.Indirect(v)返回相同的值,同时v.Elem()返回包含的动态值.
  • 如果价值是别的,那么v.Elem()恐慌.

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