当传入 reflect.New(Type) 的结果时,v.Elem() 与 Indirect(v)

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


golang - 反射包中的 Elem 与 Indirect

someX基本上它声称如果areflect.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 语言的一些基本方面,正如我在过去一周提出的堆栈溢出问题中所指出的那样。


杨__羊羊
浏览 165回答 1
1回答

Qyouu

让我们分解以下行:log.Println(reflect.ValueOf(newitem).Elem())该值newItem是一个 reflect.Value。表达式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())在操场上运行它!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go