Maison > développement back-end > Golang > Pourquoi « json.Unmarshal » échoue-t-il avec un pointeur nul vers les types primitifs ?

Pourquoi « json.Unmarshal » échoue-t-il avec un pointeur nul vers les types primitifs ?

DDD
Libérer: 2024-11-22 08:50:19
original
676 Les gens l'ont consulté

Why Does `json.Unmarshal` Fail with a Nil Pointer to Primitive Types?

Unmarshaling JSON : pointeurs vs références

La fonction json.Unmarshal nous permet de convertir les données JSON en une structure Go. Alors que la documentation suggère qu'il peut attribuer une nouvelle valeur si le pointeur est nul, ce n'est pas le cas.

Considérons l'exemple suivant :

var animals Animal

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

Cela fonctionne comme prévu car les animaux sont un pointeur non nul. Cependant, si nous changeons les animaux en un pointeur non initialisé :

var animals *Animal

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

Cela échoue avec le message d'erreur obscur :

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

Cette erreur provient d'une InvalidUnmarshalError, qui est renvoyée lorsqu'un L'argument est transmis à Unmarshal. La documentation n'indique pas explicitement que le pointeur doit être non nul, ce qui pourrait prêter à confusion.

La citation contradictoire dans la documentation, qui suggère qu'Unmarshal peut attribuer une nouvelle valeur aux pointeurs nuls, peut faire référence au comportement de la fonction Reflect.New, qui est utilisée en interne par Unmarshal pour créer une nouvelle valeur lorsque le pointeur est nul. Cependant, réflexion.New ne fonctionne que pour certains types, tels que les structures et les tranches. Cela ne fonctionne pas pour les pointeurs vers des types primitifs, tels que *int ou *string.

En résumé, json.Unmarshal nécessite un pointeur non nul comme deuxième argument. Il ne peut pas attribuer une nouvelle valeur aux pointeurs nuls de types primitifs. Par conséquent, il est important de s'assurer que le pointeur n'est pas nul avant de tenter d'y extraire des données JSON.

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