一尘不染

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

go

基本上,它声称以下表达式为真,如果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语言的一些基本方面,如我在上周一直在问的堆栈溢出问题中所述。


阅读 180

收藏
2020-07-02

共1个答案

一尘不染

让我们分解以下几行:

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

该值newItem是一个reflect.Value。表达式reflect.ValueOf(newItem)返回reflect.Value包含的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())

在操场上运行它!

2020-07-02