2 回答

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)

TA貢獻(xiàn)1839條經(jīng)驗(yàn) 獲得超15個(gè)贊
這是預(yù)期的行為:而不是給json.Unmarshal
一個(gè)指向內(nèi)存中正確類型位置的指針,而是給它一個(gè)指向內(nèi)存中類型的位置的指針interface{}
。它本質(zhì)上可以在 JSON 定義的類型下存儲任何東西,所以它就是這樣做的。
像這樣看:
Unmarshal
得到一個(gè)地方來存儲v
類型的數(shù)據(jù)interface{}
Unmarshal
檢測編碼為 JSON 的地圖Unmarshal
看到目標(biāo)類型是 typeinterface{}
,從它創(chuàng)建一個(gè) go map 并將其存儲在v
如果你給它一個(gè)不同的類型,而不是interface{}
這個(gè)過程看起來像這樣:
Unmarshal
得到一個(gè)地方來存儲v
類型的數(shù)據(jù)struct main.J
Unmarshal
檢測編碼為 JSON 的地圖Unmarshal
看到目標(biāo)類型struct main.J
并開始遞歸地將數(shù)據(jù)擬合到該類型
重點(diǎn)是,初始分配
var i interface{} = j
被 完全忽略json.Unmarshal
。
- 2 回答
- 0 關(guān)注
- 195 瀏覽
添加回答
舉報(bào)