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

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

Mary-Kate Olsen
リリース: 2024-11-21 00:50:12
オリジナル
926 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート