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
Barbara Streisandoriginal
2024-11-12 04:57:01511parcourir

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)

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)

Cela entraîne un "invalide argument" erreur :

json: Unmarshal(nil *main.Animal)

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.)

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!

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