在沒有堆疊溢位的情況下編組和解組JSON
在JSON 編碼中,在UnmarshalJSON 方法中呼叫json.
在JSON 編碼中,在UnmarshalJSON 方法中呼叫json.Unmarshaljson.導致堆疊溢位。出現此問題的原因是解碼器不斷搜尋自訂 UnmarshalJSON 實現,在本例中該實作重複呼叫。 為了避免這種情況,常見的解決方案是使用 type 關鍵字建立新類型。這種新類型有效地充當原始類型的包裝器。透過將原始值轉換為新類型並將其傳遞給 json.Unmarshal,可以防止堆疊溢位。 這種方法非常高效,因為類型轉換不會改變資料的表示。根據 Go 規範,非數字類型轉換僅修改類型,而不改變底層表示。 在以下範例中,使用數字 Age 欄位定義 Person 類型。自訂 UnmarshalJSON 方法可確保年齡永遠不會為負數:type Person struct { Name string `json:"name"` Age int `json:"age"` } func (p *Person) UnmarshalJSON(data []byte) error { type person2 Person if err := json.Unmarshal(data, (*person2)(p)); err != nil { return err } // Post-processing after unmarshaling if p.Age < 0 { p.Age = 0 } return nil }此技術也可以應用於自訂編組 (MarshalJSON) 方法,以在資料序列化之前執行預處理。 記住,在為自訂文字表示定義 String() 方法時,必須區分使用 t 和 *t 以避免無意中修改預設字串代表。
以上是在 Go 中編組和解組 JSON 時如何避免堆疊溢位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!