JSON アンマーシャル動作を理解する
json.Unmarshal を使用して JSON データをアンマーシャルしようとする場合、パッケージが変数型とどのように対話するかを理解することが重要です。 .
インターフェース誤謬
json.Unmarshal がインターフェイスに関連付けられた具象構造体を自動的に利用すると考えるのは、よくある誤解です。パッケージには、必要なアンマーシャリング タイプに関する明示的なガイダンスが必要です。
例: ロスト イン トランスレーション
提供されているコード例を検討してください。
type Foo struct { Bar string `json:"bar"` } func getFoo() interface{} { return Foo{"bar"} }
getFoo() が Foo 構造体を返すようにすることが目的ですが、それはインターフェイスに割り当てられているため、マップとして扱われます。これは、インターフェイスが json.Unmarshal に渡されると、パッケージがそれを空のインターフェイスとして解釈し、JSON オブジェクトのマップを生成するためです。
解決策: 明示的な型宣言
この問題を解決するには、目的の構造体型へのポインタを明示的に渡します。インターフェース:
func getFoo() interface{} { return &Foo{"bar"} }
json.Unmarshal がインターフェースを受け取ると、構造体へのポインターを識別し、JSON データを構造体フィールドに正しくアンマーシャルします。
重要なポイント:
json.Unmarshal は明示的な型に依存していることに注意してくださいアンマーシャリング先を決定するために提供される情報。特定の構造体を使用したい場合は、インターフェイス内でその型の値またはその型へのポインターを明示的に渡す必要があります。
以上が「json.Unmarshal」はどのようにインターフェースを処理するのか、そしてなぜ明示的な型宣言が重要なのか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。