2 回答

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)

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