JSON 編組介面的異常回傳類型
在使用json.Unmarshal 將位元組數組轉換為介面{}的場景中,當當傳回映射而不是預期的結構類型時,可能會出現意外結果。這種差異可以歸因於interface{}類型的抽象性質,使得json套件無法辨別底層結構結構。
要修正這種異常,建議明確傳遞指向所需的指標struct,將其轉換為抽象介面。這種方法允許 json 套件相應地識別和反序列化結構。
例如,以下修改後的程式碼片段說明了所需的行為:
<code class="go">func bad() { var ping interface{} = &Ping{} // Pass a pointer to Ping as an interface deserialize([]byte(`{"id":42}`), ping) fmt.Println("DONE:", ping) // Now outputs a Ping struct }</code>
或者,如果存取指標是不可行,可以利用動態分配來建立可以反序列化的新指針。然後可以使用新值更新原始 interface{} 值。
<code class="go">func bad() { var ping interface{} = Ping{} nptr := reflect.New(reflect.TypeOf(ping)) deserialize([]byte(`{"id":42}`), nptr.Interface()) ping = nptr.Interface() fmt.Println("DONE:", ping) // Outputs a Ping struct }</code>
透過採用其中一種技術,json.Unmarshal 函數可以準確地將位元組數組反序列化為所需的結構類型,從而消除意外的地圖返回值。
以上是## 為什麼 `json.Unmarshal` 在解組到介面{}時回傳映射而不是結構?的詳細內容。更多資訊請關注PHP中文網其他相關文章!