Heim  >  Artikel  >  Backend-Entwicklung  >  Hier sind einige Titeloptionen unter Berücksichtigung der Notwendigkeit eines Frageformats: * **Warum gibt „json.Unmarshal“ in Go eine Karte anstelle einer Struktur zurück?** (Einfach und direkt) * **Golang: Unmarshaling int

Hier sind einige Titeloptionen unter Berücksichtigung der Notwendigkeit eines Frageformats: * **Warum gibt „json.Unmarshal“ in Go eine Karte anstelle einer Struktur zurück?** (Einfach und direkt) * **Golang: Unmarshaling int

DDD
DDDOriginal
2024-10-26 02:44:02325Durchsuche

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

Warum gibt json.Unmarshal eine Karte anstelle der erwarteten Struktur zurück?

In diesem Spielplatzbeispiel gibt json.Unmarshal eine Karte anstelle der erwarteten Struktur zurück: http ://play.golang.org/p/dWku6SPqj5.

Das Problem entsteht, weil ein interface{}-Parameter an json.Unmarshal übergeben wird und die Bibliothek versucht, ihn in ein Byte-Array zu entmarshalieren. Allerdings hat die Bibliothek keinen direkten Verweis auf die entsprechende Struktur, obwohl sie über einen Reflect.Type-Verweis verfügt.

Das Problem liegt im folgenden Code:

<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 Um dieses Problem zu lösen, übergeben Sie entweder einen Zeiger auf die Ping-Struktur explizit als abstrakte Schnittstelle:

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

Alternativ: Wenn kein direkter Zeiger verfügbar ist, erstellen Sie einen neuen Zeiger mit „Reflect“, deserialisieren Sie ihn und kopieren Sie ihn dann der Wert zurück:

<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>

Das obige ist der detaillierte Inhalt vonHier sind einige Titeloptionen unter Berücksichtigung der Notwendigkeit eines Frageformats: * **Warum gibt „json.Unmarshal“ in Go eine Karte anstelle einer Struktur zurück?** (Einfach und direkt) * **Golang: Unmarshaling int. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn