「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 質問形式の必要性を念頭に置いて、タイトルのオプションをいくつか示します。 * **Go で `json.Unmarshal` が構造体ではなくマップを返すのはなぜですか?** (シンプルかつ直接的) * **Golang: int のアンマーシャリング

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

2024 年 11 月 8 日に公開
ブラウズ:590

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 参照があっても、対応する構造体への直接参照がありません。

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

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

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

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

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

var ping interface{} = Ping{}
nptr := reflect.New(reflect.TypeOf(ping))
deserialize([]byte(`{"id":42}`), nptr.Interface())
ping = nptr.Interface()
fmt.Println("DONE:", ping)
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3