ホームページ >バックエンド開発 >Golang >ポインターを使用すると「json.Unmarshal」が失敗するのに、参照を使用すると成功するのはなぜですか?

ポインターを使用すると「json.Unmarshal」が失敗するのに、参照を使用すると成功するのはなぜですか?

DDD
DDDオリジナル
2024-11-19 20:05:03410ブラウズ

Why Does `json.Unmarshal` Fail When Using a Pointer but Succeed with a Reference?

JSON のアンマーシャリング: 参照とポインターの違いを明らかにする

JSON 解析の領域では、json.Unmarshal は不可欠なツールです。ただし、その動作は時々不可解になることがあります。具体的には、ユーザーは、なぜ参照を使用するとアンマーシャリングがスムーズに機能するのに、ポインターを使用すると不思議なことに失敗するのか疑問に思うかもしれません。この問題の核心を掘り下げてみましょう。

参照とポインタ

最初の例では、「動物」を動物タイプの変数として定義します。 「&animals」を Unmarshal に渡すと、この変数への参照が提供されます。これにより、Unmarshal が元の構造を直接操作できるようになります。

対照的に、2 番目の例では、Animal 型へのポインタとして「animals」を宣言しています。ポインタは、変数そのものではなく、別の変数のアドレスを保持します。 「animals」を Unmarshal に直接渡すということは、初期化されていない nil ポインターを渡すことを意味します。

パラドックス

奇妙なことに、Unmarshal のドキュメントには次のように記載されています。ポインターが nil の場合は、ポインターに新しい値を割り当てることができます。では、なぜ 2 番目の例は失敗するのでしょうか?

エラーの解明

2 番目の例のエラー メッセージは、実際には InvalidUnmarshalError です。このエラーは、Unmarshal に渡された引数が無効なポインタである場合にスローされます。ドキュメントの記述にもかかわらず、アンマーシャルには引数として非 nil ポインターが必要です。

結論

ポインターを使用して JSON を適切にアンマーシャルするには、JSON を初期化する必要があります。初め。ドキュメントが示すように、これは Unmarshal を呼び出す前にポインタに有効な値を割り当てるだけで実行できます。

アンマーシャリングとアンマーシャリング

さらに、お気づきかもしれません。ドキュメントでは「アンマーシャリング」と「アンマーシャリング」の両方が使用されていることを確認してください。どちらの綴りも正しいと考えられていますが、Go コミュニティでは「アンマーシャリング」の方が一般的で好まれています。

以上がポインターを使用すると「json.Unmarshal」が失敗するのに、参照を使用すると成功するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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