ホームページ  >  記事  >  バックエンド開発  >  プリミティブ型への Nil ポインターで「json.Unmarshal」が失敗するのはなぜですか?

プリミティブ型への Nil ポインターで「json.Unmarshal」が失敗するのはなぜですか?

DDD
DDDオリジナル
2024-11-22 08:50:19601ブラウズ

Why Does `json.Unmarshal` Fail with a Nil Pointer to Primitive Types?

JSON のアンマーシャリング: ポインターと参照

json.Unmarshal 関数を使用すると、JSON データを Go 構造体に変換できます。ドキュメントでは、ポインタが nil の場合に新しい値を割り当てることができると示唆していますが、これは当てはまりません。

次の例を考えてみましょう。

var animals Animal

err := json.Unmarshal(jsonBlob, &animals)

これは、動物が nil であるため、期待どおりに機能します。 nil 以外のポインタ。ただし、動物を初期化されていないポインタに変更すると:

var animals *Animal

err := json.Unmarshal(jsonBlob, animals)

これは不明瞭なエラー メッセージで失敗します:

json: Unmarshal(nil *main.Animal)

このエラーは、無効な場合にスローされる InvalidUnmarshalError に起因します。引数は Unmarshal に渡されます。ドキュメントには、ポインタが非 nil でなければならないことが明示的に記載されていないため、混乱が生じる可能性があります。

ドキュメント内の矛盾する引用符は、Unmarshal が nil ポインタに新しい値を割り当てることができることを示唆しており、これを参照している可能性があります。これは、ポインターが nil の場合に新しい値を作成するために Unmarshal によって内部的に使用される、reflect.New 関数の動作に影響します。ただし、reflect.New は、構造体やスライスなどの特定の型に対してのみ機能します。 *int や *string などのプリミティブ型へのポインターには機能しません。

要約すると、json.Unmarshal は 2 番目の引数として非 nil ポインターを必要とします。プリミティブ型の nil ポインターに新しい値を割り当てることはできません。したがって、JSON データをアンマーシャリングする前に、ポインターが非 nil であることを確認することが重要です。

以上がプリミティブ型への Nil ポインターで「json.Unmarshal」が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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