スタック オーバーフローを伴わない JSON のマーシャリングとアンマーシャリング
JSON エンコードでは、UnmarshalJSON メソッド内で json.Unmarshal を呼び出すと、スタック オーバーフローが発生する可能性があります。この問題は、デコーダがカスタム 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 中国語 Web サイトの他の関連記事を参照してください。