我的問題與這里的這個問題有關(guān):golang - 反射包中的 Elem 與 IndirectsomeX基本上它聲稱如果areflect.Value包含指針,則下面的表達(dá)式為真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貢獻(xiàn)1786條經(jīng)驗 獲得超11個贊
讓我們分解以下行:
log.Println(reflect.ValueOf(newitem).Elem())
該值newItem是一個 reflect.Value。表達(dá)式reflect.ValueOf(newItem)返回reflect.Value包含 a 的 a reflect.Value。因為包含的值不是指針或接口,所以調(diào)用Elem()恐慌。
以下行不會引起恐慌,因為如果參數(shù)不是指針類型,則 reflect.Indirect 會返回其參數(shù)。
?log.Println(reflect.Indirect(reflect.ValueOf(newitem)))?
問題是應(yīng)用程序正在用 reflect.Values 包裝 reflect.Values。直接使用 reflect.Value,如下代碼所示:
log.Println(reflect.Indirect(newitem))
log.Println(newitem.Elem())
在操場上運行它!
- 1 回答
- 0 關(guān)注
- 235 瀏覽
添加回答
舉報
0/150
提交
取消