亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當傳入 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 關注
  • 239 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號