Maison  >  Article  >  développement back-end  >  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
DDDoriginal
2024-10-26 02:44:02325parcourir

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>

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>

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>

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