ホームページ >バックエンド開発 >Golang >Go の「interface{}」タイプで「json.Unmarshal」が失敗するのはなぜですか?

Go の「interface{}」タイプで「json.Unmarshal」が失敗するのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-04 14:24:12894ブラウズ

Why Does `json.Unmarshal` Fail with Go's `interface{}` Type?

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

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