2

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

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

4

1 回答 1

5

让我们分解以下行:

log.Println(reflect.ValueOf(newitem).Elem())

该值newItem是一个反射值。表达式reflect.ValueOf(newItem)返回reflect.Value包含 a 的 a reflect.Value。因为包含的值不是指针或接口,所以对Elem()恐慌的调用。

以下行不会恐慌,因为如果参数不是指针类型,则 reflect.Indirect 返回其参数。

 log.Println(reflect.Indirect(reflect.ValueOf(newitem))) 

问题是应用程序正在用reflect.Values 包装reflect.Values。直接使用 reflect.Value,如下代码所示:

log.Println(reflect.Indirect(newitem))
log.Println(newitem.Elem())

在操场上运行它!

于 2018-09-01T22:58:53.650 回答