首頁 >後端開發 >Golang >在 Go 中編組和解組 JSON 時如何避免堆疊溢位?

在 Go 中編組和解組 JSON 時如何避免堆疊溢位?

Patricia Arquette
Patricia Arquette原創
2024-12-26 18:52:14642瀏覽

How to Avoid Stack Overflow When Marshaling and Unmarshaling JSON in Go?

在沒有堆疊溢位的情況下編組和解組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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn