Golang インターフェイス{} 型の誤解
Go では、インターフェイス{} 型を使用して変数に任意の型の値を保持させることができます。ただし、interface{} を関数パラメータの型として使用すると、json.Unmarshal.
シナリオ 1: Unmarshal を使用した非ポインタ型
を使用するときに予期しない結果が生じる可能性があります。非ポインタ型を型インターフェイス{}の関数パラメータに渡す場合、json.Unmarshal は値にアンマーシャルできません。代わりに、新しい map[string]interface{} 値を作成し、interface{} に保存します。これは、json.Unmarshal にはアンマーシャルするためのポインターが必要であるためです。
シナリオ 2: Unmarshal を使用したポインター型
値へのポインターが代わりに渡される場合、json.アンマーシャルは期待どおりに機能し、データを指定された値にアンマーシャルします。これは、ポインターを使用すると、json パッケージで基になる値を変更できるためです。
シナリオ 3: ポインターの不正な使用法
ポインター型を使用する場合でも、その型を取得しようとすると、 json.Unmarshal に渡すとき (つまり、&&i を使用するとき) にアドレスを変更すると、予期しない動作が発生する可能性があります。この場合、json.Unmarshal はポインタを逆参照し、非ポインタを含むインターフェース値を見つけて、新しい map[string]interface{} 値を作成します。
説明
interface{} は、単なる型のないコンテナではなく、それ自体が型です。値とその型をラップします。インターフェイス{}へのポインタを渡すと、他のパッケージが基礎となる値を変更できるようになりますが、インターフェイス{}の値を直接渡すと変更が防止されます。
ベスト プラクティス
混乱を避けるため、インターフェイスへのポインターではなく、インターフェイス内の値へのポインターを使用することをお勧めします。このアプローチにより、json パッケージがデータを目的の型に正しくアンマーシャリングできるようになります。
以上がGo の「interface{}」タイプで「json.Unmarshal」が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。