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

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

解組為接口類型

解組為接口類型

Go
藍山帝景 2021-12-27 10:46:49
我希望下面的代碼打印一個類型為 struct 的對象J,但是它打印一個類型為的地圖對象map[string]interface{}。我能感覺到它為什么會這樣,但是當我運行時,reflect.ValueOf(i).Kind(),它返回Struct,所以它給我的印象是Unmarshal方法應該返回類型J而不是映射。誰能啟發我?type J struct {    Text string}func main() {    j := J{}    var i interface{} = j    js := "{\"Text\": \"lala\"}"    json.Unmarshal([]byte(js), &i)    fmt.Printf("%#v", i)}
查看完整描述

2 回答

?
慕工程0101907

TA貢獻1887條經驗 獲得超5個贊

您傳入的類型Unmarshal不是*J,而是傳入*interface{}.


當json包反映它收到的指針的類型時,它會看到interface{},所以它然后使用包的默認類型來解組,它們是


bool, for JSON booleans

float64, for JSON numbers

string, for JSON strings

[]interface{}, for JSON arrays

map[string]interface{}, for JSON objects

nil for JSON null

幾乎沒有理由使用指向接口的指針。如果您發現自己在使用指向接口的指針,而您不知道確切原因,那么這可能是一個錯誤。如果你想解組成J,那么直接傳入。如果需要將其分配給中間接口,請確保使用指向原始值的指針,而不是指向其接口的指針。


http://play.golang.org/p/uJDFKfSIxN


j := J{}

var i interface{} = &j


js := "{\"Text\": \"lala\"}"


json.Unmarshal([]byte(js), i)


fmt.Printf("%#v", i)


查看完整回答
反對 回復 2021-12-27
?
紫衣仙女

TA貢獻1839條經驗 獲得超15個贊

這是預期的行為:而不是給json.Unmarshal一個指向內存中正確類型位置的指針,而是給它一個指向內存中類型的位置的指針interface{}。它本質上可以在 JSON 定義的類型下存儲任何東西,所以它就是這樣做的。

像這樣看:

  1. Unmarshal得到一個地方來存儲v類型的數據interface{}

  2. Unmarshal 檢測編碼為 JSON 的地圖

  3. Unmarshal看到目標類型是 type interface{},從它創建一個 go map 并將其存儲在v

如果你給它一個不同的類型,而不是interface{}這個過程看起來像這樣:

  1. Unmarshal得到一個地方來存儲v類型的數據struct main.J

  2. Unmarshal 檢測編碼為 JSON 的地圖

  3. Unmarshal看到目標類型struct main.J并開始遞歸地將數據擬合到該類型

重點是,初始分配

var i interface{} = j

被 完全忽略json.Unmarshal。


查看完整回答
反對 回復 2021-12-27
  • 2 回答
  • 0 關注
  • 203 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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