在UnmarshalJSON 函數內部呼叫json.Unmarshal 而不發生堆疊溢位
在自訂」中,呼叫不符, type) 可能會導致堆疊溢位。出現這種情況是因為 JSON 解碼器重複檢查自訂 UnmarshalJSON 實現,從而導致無休止的遞歸。
要避免此問題,請使用 type 關鍵字建立新類型,並使用類型轉換將原始值指派給它。這是可能的,因為新類型將原始類型作為其基礎類型。
範例:
假設我們有一個帶有 Age 欄位的 Person 型別。為了確保 Age 不能為負數,我們可以實作 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 }
在這種方法中,類型 person2 會建立一個沒有方法的新類型,從而防止遞歸。資料解組後,會先指派給 person2 類型,然後指派給原始 Person 類型,以便進行後處理。
測試:
import ( "encoding/json" "fmt" ) func main() { var p *Person fmt.Println(json.Unmarshal([]byte(`{"name":"Bob","age":10}`), &p)) fmt.Println(p) fmt.Println(json.Unmarshal([]byte(`{"name":"Bob","age":-1}`), &p)) fmt.Println(p) }
輸出:
<nil> &{Bob 10} <nil> &{Bob 0}
這演示瞭如何自定義自訂堆疊溢位。
以上是在 UnmarshalJSON 中使用 json.Unmarshal 時如何避免堆疊溢位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!