Maison > développement back-end > Golang > Pourquoi « json.Unmarshal » se comporte-t-il différemment avec les valeurs de pointeur et non-pointeur transmises à un paramètre « interface{} » dans Go ?

Pourquoi « json.Unmarshal » se comporte-t-il différemment avec les valeurs de pointeur et non-pointeur transmises à un paramètre « interface{} » dans Go ?

Susan Sarandon
Libérer: 2024-12-15 20:38:15
original
784 Les gens l'ont consulté

Why Does `json.Unmarshal` Behave Differently with Pointer and Non-Pointer Values Passed to an `interface{}` Parameter in Go?

Interface Golang{} Incompréhension du type

Lors de l'utilisation d'une interface{} comme type de paramètre de fonction dans Go, il est important de comprendre comment elle affecte l'utilisation de json.Unmarshal. La transmission d'un type non-pointeur à un paramètre d'interface{} peut entraîner des résultats inattendus.

Scénario 1 : Transmission d'une valeur non-pointeur à l'interface{}

Dans Dans l'exemple donné, une structure Test est transmise directement à la fonction de test, qui attend un paramètre interface{} :

test(Test{})
Copier après la connexion

La sortie montre que le struct a été converti en map[string]interface{} par json.Unmarshal :

main.Test
*interface {}
map[string]interface {}
Copier après la connexion

C'est parce que interface{} encapsule une paire (valeur ; type) et que la valeur transmise n'est pas un pointeur , donc le package json crée une nouvelle valeur dans laquelle désorganiser. Puisque la valeur par défaut des objets JSON est map[string]interface{}, c'est ce qui est créé.

Scénario 2 : Passer un pointeur vers l'interface{}

Passer un le pointeur vers la structure Test de la fonction de test produit cependant le résultat attendu :

test(&Test{})
Copier après la connexion
*main.Test
*interface {}
*main.Test
&{bar}
Copier après la connexion

Ceci est car le pointeur vers la structure est transmis à json.Unmarshal, lui permettant de se désorganiser directement dans la valeur Test pointée.

Explication : pointeurs et interfaces

Quand un package doit modifier une valeur stockée dans une interface{}, il doit recevoir un pointeur vers celle-ci. Dans le cas de json.Unmarshal, il attend un pointeur vers lequel démarshaler. Lorsque vous disposez d'une valeur interface{} qui enveloppe déjà un pointeur, transmettez-la simplement sans reprendre son adresse.

Bonne pratique

Évitez d'utiliser des pointeurs vers des interfaces. Au lieu de cela, placez des pointeurs dans les interfaces en les enveloppant dans la valeur de l'interface. Lorsque vous devez transmettre une interface{} contenant un pointeur, transmettez-la simplement directement.

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!

source:php.cn
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal