ホームページ  >  記事  >  バックエンド開発  >  質問形式の必要性を念頭に置いて、タイトルのオプションをいくつか示します。 * **Go で `json.Unmarshal` が構造体ではなくマップを返すのはなぜですか?** (シンプルかつ直接的) * **Golang: int のアンマーシャリング

質問形式の必要性を念頭に置いて、タイトルのオプションをいくつか示します。 * **Go で `json.Unmarshal` が構造体ではなくマップを返すのはなぜですか?** (シンプルかつ直接的) * **Golang: int のアンマーシャリング

DDD
DDDオリジナル
2024-10-26 02:44:02325ブラウズ

Here are a few title options, keeping in mind the need for a question format:

* **Why Does `json.Unmarshal` Return a Map Instead of a  Struct in Go?** (Simple and direct)
* **Golang: Unmarshaling into an Interface - Why is My Struct a Map?** (More specif

なぜ json.Unmarshal は予期される構造体の代わりにマップを返すのですか?

このプレイグラウンドの例では、json.Unmarshal は予期される構造体の代わりにマップを返します: http ://play.golang.org/p/dWku6SPqj5.

この問題は、interface{} パラメータが json.Unmarshal に渡され、ライブラリがそれをバイト配列にアンマーシャルしようとするために発生します。ただし、ライブラリには、reflect.Type 参照があっても、対応する構造体への直接参照がありません。

問題は次のコードにあります。

<code class="go">var ping interface{} = Ping{}
deserialize([]byte(`{"id":42}`), &ping)
fmt.Println("DONE:", ping) // It's a simple map now, not a Ping. Why?</code>

Toこの問題を解決するには、Ping 構造体へのポインタを抽象インターフェイスとして明示的に渡します:

<code class="go">var ping interface{} = &Ping{}
deserialize([]byte(`{"id":42}`), ping)
fmt.Println("DONE:", ping)</code>

または、直接ポインタが利用できない場合は、reflect を使用して新しいポインタを作成し、それに逆シリアル化してコピーします。値を戻す:

<code class="go">var ping interface{} = Ping{}
nptr := reflect.New(reflect.TypeOf(ping))
deserialize([]byte(`{"id":42}`), nptr.Interface())
ping = nptr.Interface()
fmt.Println("DONE:", ping)</code>

以上が質問形式の必要性を念頭に置いて、タイトルのオプションをいくつか示します。 * **Go で `json.Unmarshal` が構造体ではなくマップを返すのはなぜですか?** (シンプルかつ直接的) * **Golang: int のアンマーシャリングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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