このプレイグラウンドの例では、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