首頁 > 後端開發 > Golang > 在 `UnmarshalJSON` 中呼叫 `json.Unmarshal` 時如何避免堆疊溢位?

在 `UnmarshalJSON` 中呼叫 `json.Unmarshal` 時如何避免堆疊溢位?

Susan Sarandon
發布: 2024-12-25 19:18:16
原創
836 人瀏覽過

How to Avoid Stack Overflow When Calling `json.Unmarshal` Within `UnmarshalJSON`?

在UnmarshalJSON 中呼叫json.Unmarshal 而不會導致堆疊溢位

問題:

問題:

解決方案:

  1. 要避免在UnmarshalJSON 中呼叫json.Unmarshal 時出現堆疊溢位問題,請使用下列技術:
  2. 使用type 關鍵字建立一個新類型,使其成為原始類型的包裝器類型。
  3. 將原始值型別轉換為包裝型別的實例。
  4. 在包裝類型物件上呼叫 json.Unmarshal 來執行解組。

解組後,對原件執行任何自訂後處理type.

推理:

使用type 關鍵字建立新類型會有效地刪除原始類型中的所有方法。當在解組過程中使用包裝器類型時,JSON 解碼器將找不到自訂的 UnmarshalJSON 實現,並將使用預設的實作。這可以防止堆疊溢位問題。

範例:

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func (p *Person) UnmarshalJSON(data []byte) error {
    type personWrapper Person
    if err := json.Unmarshal(data, (*personWrapper)(p)); err != nil {
        return err
    }

    // Post-processing after unmarshaling:
    if p.Age < 0 {
        p.Age = 0
    }
    return nil
}
登入後複製

考慮Age 欄位的Person 類型:

此技術允許自訂解組後進行後處理,同時避免與呼叫json.Unmarshal 相關的堆疊溢位問題解組JSON。

以上是在 `UnmarshalJSON` 中呼叫 `json.Unmarshal` 時如何避免堆疊溢位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板