Maison > développement back-end > Golang > Pourquoi « json.Unmarshal » fonctionne-t-il avec une référence mais pas avec un pointeur ?

Pourquoi « json.Unmarshal » fonctionne-t-il avec une référence mais pas avec un pointeur ?

Barbara Streisand
Libérer: 2024-11-12 04:57:01
original
509 Les gens l'ont consulté

Why Does `json.Unmarshal` Work with a Reference but Not a Pointer?

Pourquoi Unmarshal fonctionne-t-il avec une référence mais pas avec un pointeur ?

Pour fournir un contexte à cette enquête, dans Go, la fonction json.Unmarshal désérialise Données JSON dans une structure pointée par la référence fournie. Examinons le comportement d'Unmarshal dans deux scénarios.

Scénario 1 : Référence à une structure

Dans le premier scénario, une référence non nulle à une structure est transmis à Unmarshal, comme dans l'extrait suivant :

var animals Animal
err := json.Unmarshal(jsonBlob, &animals)
Copier après la connexion

Cela fonctionne parfaitement. Selon la documentation, si le pointeur est nul (initialisé à zéro), Unmarshal alloue une nouvelle valeur de structure vers laquelle pointer. Cependant, dans ce cas, animaux est déjà initialisé et pointe vers une structure valide, donc l'opération réussit.

Scénario 2 : Pointeur vers une structure

Dans ce scénario , un pointeur non initialisé vers une structure est transmis à Unmarshal.

var animals *Animal
err := json.Unmarshal(jsonBlob, animals)
Copier après la connexion

Cela entraîne un "invalide argument" erreur :

json: Unmarshal(nil *main.Animal)
Copier après la connexion

Cela se produit car la documentation n'est pas tout à fait claire. Bien qu'il mentionne qu'Unmarshal alloue une nouvelle structure si le pointeur est nul, il n'indique pas explicitement que le pointeur lui-même doit être non nul, comme indiqué dans le commentaire suivant dans le code source d'Unmarshal :

// An InvalidUnmarshalError describes an invalid argument passed to Unmarshal.
// (The argument to Unmarshal must be a non-nil pointer.)
Copier après la connexion

Par conséquent, passer un pointeur non initialisé (qui est nul par défaut dans Go) à Unmarshal déclenche cette erreur, car il viole l'exigence d'un pointeur non nul. pointeur. Pour résoudre ce problème, initialisez simplement le pointeur sur une nouvelle structure avant d'appeler Unmarshal.

Orthographe de "Unmarshaling"

En ce qui concerne l'orthographe, "unmarshalling" et "unmarshaling" sont des orthographes acceptées, la seconde étant plus courante dans le code Go selon un grep de la source Go base de 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!

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