"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > 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

Publié le 2024-11-08
Parcourir:723

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 :

var ping interface{} = Ping{}
deserialize([]byte(`{"id":42}`), &ping)
fmt.Println("DONE:", ping) // It's a simple map now, not a Ping. Why?

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

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

Vous pouvez également créer un nouveau pointeur à l'aide de Reflect, le désérialiser, puis recopier la valeur :

var ping interface{} = Ping{}
nptr := reflect.New(reflect.TypeOf(ping))
deserialize([]byte(`{"id":42}`), nptr.Interface())
ping = nptr.Interface()
fmt.Println("DONE:", ping)
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3