ホームページ >バックエンド開発 >Golang >Go で初期化されていないポインターへのアンマーシャリングが失敗するのはなぜですか?

Go で初期化されていないポインターへのアンマーシャリングが失敗するのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-21 00:50:12937ブラウズ

Why Does Unmarshaling into an Uninitialized Pointer Fail in Go?

参照とポインターへのアンマーシャリング

JSON データを Go 構造体に逆シリアル化するプロセスでは、json.Unmarshal 関数が重要な役割を果たします。ただし、ユーザーが参照とポインターにアンマーシャリングしようとすると、不一致が発生する可能性があります。

次のコード スニペットを検討してください。

// Unmarshaling into a reference variable
var animals Animal
err := json.Unmarshal(jsonBlob, &animals)

このコードは、JSON データを動物参照変数にアンマーシャリングします。

ただし、ポインター変数にアンマーシャルしようとすると、別の結果が生じます:

// Unmarshaling into a pointer variable
var animals *Animal
err := json.Unmarshal(jsonBlob, animals)

この場合、アンマーシャルは不明瞭なエラーで失敗します: "json: Unmarshal(nil *main.Animal )」。このエラーは、animals が初期化されていないポインタであるために発生します。

Unmarshal のドキュメントには、「ポインタが nil の場合、Unmarshal はポインタが指す新しい値を割り当てる」と記載されています。ただし、エラー メッセージに示されているように、この動作は初期化されていないポインターの場合には当てはまらないようです。

この問題を解決するには、アンマーシャリングを試みる前にポインター変数 Animals を初期化することをお勧めします。

animals = &Animal{}
err := json.Unmarshal(jsonBlob, animals)

この変更により、アンマーシャリング プロセスは成功するはずです。

ドキュメントでは、「アンマーシャリング」という用語が一貫して使用されていることに注意してください。

以上がGo で初期化されていないポインターへのアンマーシャリングが失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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