我的问题在这里与这个问题有关:
golang - 反射包中的 Elem Vs Indirect
基本上它声称下面的表达式为真,如果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 语言的一些基本方面,如我过去一周一直在问的堆栈溢出问题中所表示的那样。