ホームページ >バックエンド開発 >Golang >「json.Unmarshal」が参照では機能するのにポインタでは機能しないのはなぜですか?

「json.Unmarshal」が参照では機能するのにポインタでは機能しないのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-12 04:57:01513ブラウズ

Why Does `json.Unmarshal` Work with a Reference but Not a Pointer?

アンマーシャルは参照では機能するがポインタでは機能しないのはなぜですか?

この問い合わせのコンテキストを提供するために、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 サイトの他の関連記事を参照してください。

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