为何Go语言中reflect.ValueOf()在调用与被调函数输出不同?
Go反射输出差异的原因解析
先看你提供的代码:
package main import ( "fmt" "reflect" ) type Auth struct { a, b interface{} } func main() { fmt.Println("--------p1,s1--------") p1 := Auth{} fmt.Println(p1) s1 := reflect.ValueOf(p1) fmt.Println(s1) fmt.Println("-------s---------") callFunc(p1) } func callFunc(a ...interface{}) { s := reflect.ValueOf(a) fmt.Println(s) }
执行go run nil.go后,s和s1的输出差异,核心原因在于可变参数的包装逻辑:
s1的本质s1 := reflect.ValueOf(p1)是直接对Auth类型的实例p1做反射,得到的是Auth结构体的反射值,输出自然是结构体本身的内容:{ <nil> <nil> }。s的本质callFunc的参数是a ...interface{},这是Go的可变参数语法糖。当你传入单个p1时,Go会自动把p1包装成一个长度为1的[]interface{}切片,相当于你调用了callFunc([]interface{}{p1})。
此时s := reflect.ValueOf(a)是对这个切片做反射,得到的是切片类型的反射值,所以输出会带外层方括号:[{ <nil> <nil> }]——方括号表示这是一个切片,里面的元素才是p1实例。
简单说:s1反射的是Auth实例,s反射的是装着Auth实例的切片,两者指向的根本不是同一个值,输出自然不同。
内容的提问来源于stack exchange,提问作者Ayush Raj
相关产品推荐
相关产品推荐

