最近、ポインターを渡すときに json.Unmarshal を使用すると予期しない動作が起こることにユーザーが気づきました。違いが存在する理由を調べてみましょう。
公式ドキュメントでは、ポインターが最初に nil の場合に、Unmarshal が指す新しい値を自動割り当てすることを示唆するステートメントに遭遇します。
Unmarshal JSON をポインタが指す値にアンマーシャリングします。ポインタが nil の場合、Unmarshal はポインタが指す新しい値を割り当てます。
ただし、初期化されていないポインタで Unmarshal を使用しようとすると、InvalidUnmarshalError:
// InvalidUnmarshalError が発生します。 Unmarshal に渡される無効な引数について説明します。
// (Unmarshal への引数は非 nil ポインターである必要があります。)
このエラーは、ドキュメントの提案と矛盾します。
この不一致を解決するには、参照とポインターの使用の微妙な違いに対処することが重要です。コードが動作する最初の例では、&animals を使用することで変数への参照が作成され、変数が常に非 nil であることが保証されます。この参照動作は、期待される機能と一致しています。
対照的に、2 番目の例では、初期化されていないポインター (*animals) が使用されており、これは Unmarshal から見て無効な引数を表します。生成されるエラーは、この問題を正確に反映しています。
最後の注意として、公式ドキュメントによると、この単語の正しいスペルは「アンマーシャリング」です。
以上が初期化されていないポインターを使用すると、「json.Unmarshal」が「InvalidUnmarshalError」をスローするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。