UnmarshalJSON で json.Unmarshal を呼び出すときのスタック オーバーフローの回避
カスタム UnmarshalJSON 実装内で json.Unmarshal(b, type) を呼び出すと、次のような問題が発生する可能性がありますスタックオーバーフローエラーになります。これは、JSON デコーダがその型のカスタム UnmarshalJSON 実装を繰り返し検索しようとし、無限ループが発生するために発生します。
解決策: 新しい型を作成する
回避するにはこの問題では、type キーワードを使用して新しいタイプを作成します。この新しい型は、UnmarshalJSON など、元の型のメソッドを継承しません。
type person2 Person
使用法:
を使用して、元の型の値を新しい型に変換します。タイプ変換:
if err := json.Unmarshal(data, (*person2)(p)); err != nil { return err }
例:
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 } // Custom processing if p.Age < 0 { p.Age = 0 } return nil }
利点:
以上がUnmarshalJSON 内で json.Unmarshal を使用するときにスタック オーバーフロー エラーを防ぐ方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。