我的问题与这里的这个问题相关:
golang - 反射包中的 Elem 与间接 https://stackoverflow.com/questions/24318389/golang-elem-vs-indirect-in-the-reflect-package
基本上它声称下面的表达式为真,如果someX
is a 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 语言的一些基本方面,正如我过去一周提出的堆栈溢出问题中所指出的那样。
让我们分解以下行:
log.Println(reflect.ValueOf(newitem).Elem())
价值newItem
是一个reflect.Value。表达方式reflect.ValueOf(newItem)
返回一个reflect.Value
含有一个reflect.Value
。因为包含的值不是指针或接口,所以调用Elem()
panics.
以下行不会出现恐慌,因为如果参数不是指针类型,reflect.Indirect 将返回其参数。
log.Println(reflect.Indirect(reflect.ValueOf(newitem)))
问题在于应用程序正在用reflect.Values 包装reflect.Values。直接使用reflect.Value,如以下代码所示:
log.Println(reflect.Indirect(newitem))
log.Println(newitem.Elem())
在操场上运行它! https://play.golang.org/p/sZAa6uW4Cup
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)