ホームページ >バックエンド開発 >Golang >UnmarshalJSON 内で json.Unmarshal を使用するときにスタック オーバーフロー エラーを防ぐ方法は?

UnmarshalJSON 内で json.Unmarshal を使用するときにスタック オーバーフロー エラーを防ぐ方法は?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-19 18:36:10944ブラウズ

How to Prevent Stack Overflow Errors When Using json.Unmarshal within UnmarshalJSON?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。