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