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!