来自文档
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().
间接方法只是上述右侧的便捷方法吗?
答案 0 :(得分:17)
如果reflect.Value
是指针,则v.Elem()
相当于reflect.Indirect(v)
。如果它不是指针,则它们不等同:
reflect.Indirect(v)
将返回相同的值,而v.Elem()
将返回包含的动态值。v.Elem()
将会发生恐慌。 reflect.Indirect
帮助程序适用于您要接受特定类型或指向该类型的指针的情况。一个例子是database/sql
转换例程:通过使用reflect.Indirect
,它可以使用相同的代码路径来处理各种类型和指向这些类型的指针。