Maison > développement back-end > Golang > Voici quelques options de titre, en gardant à l'esprit la nécessité d'un format de question : * **Pourquoi `json.Unmarshal` renvoie-t-il une carte au lieu d'une structure dans Go ?** (Simple et direct) * **Golang : démarshalisation de l'int

Voici quelques options de titre, en gardant à l'esprit la nécessité d'un format de question : * **Pourquoi `json.Unmarshal` renvoie-t-il une carte au lieu d'une structure dans Go ?** (Simple et direct) * **Golang : démarshalisation de l'int

DDD
Libérer: 2024-10-26 02:44:02
original
535 Les gens l'ont consulté

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

Pourquoi json.Unmarshal renvoie-t-il une carte au lieu de la structure attendue ?

Dans cet exemple de terrain de jeu, json.Unmarshal renvoie une carte au lieu de la structure attendue : http ://play.golang.org/p/dWku6SPqj5.

Le problème survient car un paramètre interface{} est transmis à json.Unmarshal et la bibliothèque tente de le désorganiser dans un tableau d'octets. Cependant, la bibliothèque n'a pas de référence directe à la structure correspondante, même si elle a une référence Reflect.Type.

Le problème réside dans le code suivant :

<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>
Copier après la connexion

Pour résolvez ce problème, soit transmettez explicitement un pointeur vers la structure Ping en tant qu'interface abstraite :

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

Alternativement, si un pointeur direct n'est pas disponible, créez un nouveau pointeur à l'aide de Reflect, désérialisez-le, puis copiez-le. la valeur en retour :

<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>
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal