v.Elem()与Inref(v)传递reflect.New(Type)的结果时

时间:2018-09-01 22:03:49

标签: go go-reflect

我的问题与这里的问题有关:

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语言的一些基本方面,如上周我一直在问的堆栈溢出问题所表明的。

1 个答案:

答案 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))) 

Run it on the Playground!