我的问题与这里的问题有关:
golang - Elem Vs Indirect in the reflect package
基本上,它声称如果someX
是包含指针的reflect.Value
,则下面的表达式为真
reflect.Indirect(reflect.ValueOf(someX)) === reflect.ValueOf(someX).Elem()
如果是这种情况,那为什么我下面的代码在最后一行崩溃了?
package main
import (
"reflect"
"log"
)
type Person struct {
Name string
}
func main() {
newitem := reflect.New(reflect.ValueOf(Person{}).Type())
log.Println(reflect.TypeOf(newitem)) // shows reflect.Value
log.Println(newitem.Type().Kind()) // shows it is a ptr
log.Println(reflect.Indirect(reflect.ValueOf(newitem))) // this line does not cause panic
log.Println(reflect.ValueOf(newitem).Elem()) // this line causes panic
}
我一直很难理解Go中的reflect包,并且可能我误解了Go语言的一些基本方面,如上周我一直在问的堆栈溢出问题所表明的。
答案 0 :(得分:4)
让我们细分以下行:
log.Println(reflect.ValueOf(newitem).Elem())
值newItem
是reflect.Value。表达式reflect.ValueOf(newItem)
返回包含reflect.Value
的{{1}}。由于所包含的值不是指针或接口,因此对reflect.Value
的调用会出现紧急情况。
以下行不会出现紧急情况,因为如果参数不是指针类型,则reflect.Indirect将返回其参数。
Elem()
问题在于应用程序将reflect.Values与reflect.Values包装在一起。如以下代码所示,直接使用reflect.Value:
log.Println(reflect.Indirect(reflect.ValueOf(newitem)))