このプレイグラウンドの例では、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 サイトの他の関連記事を参照してください。