第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

解組為接口類型

解組為接口類型

Go
藍(lán)山帝景 2021-12-27 10:46:49
我希望下面的代碼打印一個(gè)類型為 struct 的對象J,但是它打印一個(gè)類型為的地圖對象map[string]interface{}。我能感覺到它為什么會這樣,但是當(dāng)我運(yùn)行時(shí),reflect.ValueOf(i).Kind(),它返回Struct,所以它給我的印象是Unmarshal方法應(yīng)該返回類型J而不是映射。誰能啟發(fā)我?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貢獻(xiàn)1887條經(jīng)驗(yàn) 獲得超5個(gè)贊

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


當(dāng)json包反映它收到的指針的類型時(shí),它會看到interface{},所以它然后使用包的默認(rèn)類型來解組,它們是


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

幾乎沒有理由使用指向接口的指針。如果您發(fā)現(xiàn)自己在使用指向接口的指針,而您不知道確切原因,那么這可能是一個(gè)錯(cuò)誤。如果你想解組成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)


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

TA貢獻(xiàn)1839條經(jīng)驗(yàn) 獲得超15個(gè)贊

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

像這樣看:

  1. Unmarshal得到一個(gè)地方來存儲v類型的數(shù)據(jù)interface{}

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

  3. Unmarshal看到目標(biāo)類型是 type interface{},從它創(chuàng)建一個(gè) go map 并將其存儲在v

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

  1. Unmarshal得到一個(gè)地方來存儲v類型的數(shù)據(jù)struct main.J

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

  3. Unmarshal看到目標(biāo)類型struct main.J并開始遞歸地將數(shù)據(jù)擬合到該類型

重點(diǎn)是,初始分配

var i interface{} = j

被 完全忽略json.Unmarshal。


查看完整回答
反對 回復(fù) 2021-12-27
  • 2 回答
  • 0 關(guān)注
  • 195 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號