v.Elem() 与 Indirect(v) 在传递 reflect.New(Type) 的结果时
v.Elem() Vs Indirect(v) when passing in result of a reflect.New(Type)
我的问题与这里的这个问题有关:
golang - Elem Vs Indirect in the reflect package
基本上它声称如果 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 语言的一些基本方面,正如我在过去一周提出的堆栈溢出问题中所指出的那样。
让我们分解以下行:
log.Println(reflect.ValueOf(newitem).Elem())
值 newItem
是 reflect.Value。表达式 reflect.ValueOf(newItem)
returns 一个 reflect.Value
包含一个 reflect.Value
。因为包含的值不是指针或接口,所以对 Elem()
的调用会发生混乱。
下一行不会恐慌,因为 reflect.Indirect returns 如果参数不是指针类型,则它的参数。
log.Println(reflect.Indirect(reflect.ValueOf(newitem)))
问题是应用程序用 reflect.Value 包装了 reflect.Value。直接使用 reflect.Value 如下代码:
log.Println(reflect.Indirect(newitem))
log.Println(newitem.Elem())
我的问题与这里的这个问题有关:
golang - Elem Vs Indirect in the reflect package
基本上它声称如果 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 语言的一些基本方面,正如我在过去一周提出的堆栈溢出问题中所指出的那样。
让我们分解以下行:
log.Println(reflect.ValueOf(newitem).Elem())
值 newItem
是 reflect.Value。表达式 reflect.ValueOf(newItem)
returns 一个 reflect.Value
包含一个 reflect.Value
。因为包含的值不是指针或接口,所以对 Elem()
的调用会发生混乱。
下一行不会恐慌,因为 reflect.Indirect returns 如果参数不是指针类型,则它的参数。
log.Println(reflect.Indirect(reflect.ValueOf(newitem)))
问题是应用程序用 reflect.Value 包装了 reflect.Value。直接使用 reflect.Value 如下代码:
log.Println(reflect.Indirect(newitem))
log.Println(newitem.Elem())