JSON を具体的な構造体にアンマーシャリングする
複雑なデータ構造を扱う場合、多くの場合、JSON をインターフェースではなく具体的な構造体にアンマーシャリングする必要があります。 。ただし、json.Unmarshal のデフォルトの動作は、宛先がインターフェイスの場合に JSON データをマップに変換します。
問題の説明
提供された例では、 getFoo 関数は、具体的な Foo 構造体をラップするインターフェース値を返します。{}この値を指定して json.Unmarshal を呼び出すと、interface{} タイプだけではアンマーシャリングに十分な情報が提供されないため、基になる Foo 構造体を使用する代わりにマップが作成されます。
解決策: 明示的に渡す構造体参照
この問題を解決するには、具体的な構造体へのポインタを明示的に渡す必要があります。 json.アンマーシャル。これにより、デコーダが正しい構造体タイプを確実に識別できるようになります。
func getFoo() interface{} { return &Foo{"bar"} }
構造体へのポインタを返すことにより、インターフェース ラッパーに具象タイプへの参照が含まれるようになり、json.Unmarshal がその構造体をアンマーシャリングできるようになります。{}データは正しくあります。
注:
です。この解決策は、コンパイル時に特定の構造体の型が不明な場合に適用されることに注意してください。構造体の型がわかっている場合は、型の安全性とパフォーマンスを向上させるために、それを json.Unmarshal に直接渡すことをお勧めします。
以上がGo で「interface{}」を使用するときに JSON を具体的な構造体にアンマーシャリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。