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
Susan Sarandonoriginal
2024-12-15 20:38:15788parcourir

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{})

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

main.Test
*interface {}
map[string]interface {}

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{})
*main.Test
*interface {}
*main.Test
&{bar}

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!

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