golang - 反射包中的Elem Vs Indirect

时间:2014-06-20 00:45:12

标签: go

来自文档

func (v Value) Elem() Value

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

func Indirect(v Value) Value

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

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

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

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

1 个答案:

答案 0 :(得分:17)

如果reflect.Value是指针,则v.Elem()相当于reflect.Indirect(v)。如果它不是指针,则它们不等同:

  • 如果该值是界面,则reflect.Indirect(v)将返回相同的值,而v.Elem()将返回包含的动态值。
  • 如果该值是其他值,那么v.Elem()将会发生恐慌。

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