アンマーシャルは参照では機能するがポインタでは機能しないのはなぜですか?
この問い合わせのコンテキストを提供するために、Go では json.Unmarshal 関数を逆シリアル化します。 JSON データを、指定された参照が指す構造体に格納します。 2 つのシナリオで Unmarshal の動作を詳しく見てみましょう。
シナリオ 1: 構造体への参照
最初のシナリオでは、構造体への非 nil 参照は次のとおりです。次のスニペットのように、Unmarshal に渡されます:
var animals Animal err := json.Unmarshal(jsonBlob, &animals)
これはシームレスに機能します。ドキュメントによると、ポインターが nil (ゼロに初期化) の場合、Unmarshal は指す新しい構造体の値を割り当てます。ただし、この場合、動物はすでに初期化されており、有効な構造体を指しているため、操作は成功します。
シナリオ 2: 構造体へのポインター
このシナリオでは、構造体への初期化されていないポインターが Unmarshal に渡されます。
var animals *Animal err := json.Unmarshal(jsonBlob, animals)
これにより、「無効な引数」エラーが発生します:
json: Unmarshal(nil *main.Animal)
これは、ドキュメントが完全に明確ではないために発生します。ポインタが nil の場合、Unmarshal は新しい構造体を割り当てると述べていますが、Unmarshal のソース コードの次のコメントに示されているように、ポインタ自体が非 nil でなければならないとは明示的に述べていません:
// An InvalidUnmarshalError describes an invalid argument passed to Unmarshal. // (The argument to Unmarshal must be a non-nil pointer.)
したがって、初期化されていないポインター (Go ではデフォルトで nil) を Unmarshal に渡すと、非 nil ポインターの要件に違反するため、このエラーが発生します。この問題を解決するには、Unmarshal を呼び出す前に新しい構造体へのポインタを初期化するだけです。
「Unmarshaling」のスペル
スペルに関しては、「unmarshalling」と「Unmarshaling」の両方が必要です。 「アンマーシャリング」は受け入れられているスペルであり、Go ソース コードベースの grep によると、Go コードでは 2 番目のスペルがより一般的です。
以上が「json.Unmarshal」が参照では機能するのにポインタでは機能しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。