我的问题与这里的这个问题有关: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())
在操场上运行它!
- 1 回答
- 0 关注
- 164 浏览
添加回答
举报
0/150
提交
取消