为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
杨__羊羊 2023-03-29 15:43:13
我的问题与这里的这个问题有关:golang - 反射包中的 Elem 与 IndirectsomeX基本上它声称如果areflect.Value包含指针,则下面的表达式为真reflect.Indirect(reflect.ValueOf(someX)) === reflect.ValueOf(someX).Elem()如果是这样,那为什么我下面的代码在最后一行崩溃了?package mainimport (  "reflect"  "log")type Person struct {  Name string}func main() {newitem := reflect.New(reflect.ValueOf(Person{}).Type())log.Println(reflect.TypeOf(newitem)) // shows reflect.Valuelog.Println(newitem.Type().Kind()) // shows it is a ptrlog.Println(reflect.Indirect(reflect.ValueOf(newitem))) // this line does not cause paniclog.Println(reflect.ValueOf(newitem).Elem()) // this line causes panic}我一直很难理解 Go 中的 reflect 包,很可能我误解了 Go 语言的一些基本方面,正如我在过去一周提出的堆栈溢出问题中所指出的那样。
查看完整描述

1 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

让我们分解以下行:


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())

在操场上运行它!


查看完整回答
反对 回复 2023-03-29
  • 1 回答
  • 0 关注
  • 128 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信