Maison  >  Article  >  développement back-end  >  Pourquoi le démarshaling dans un pointeur non initialisé échoue-t-il lors de Go ?

Pourquoi le démarshaling dans un pointeur non initialisé échoue-t-il lors de Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-21 00:50:12874parcourir

Why Does Unmarshaling into an Uninitialized Pointer Fail in Go?

Désérialisation en références et pointeurs

Dans le processus de désérialisation des données JSON en structures Go, la fonction json.Unmarshal joue un rôle crucial. Cependant, les utilisateurs peuvent rencontrer des divergences lorsqu'ils tentent de désorganiser les références et les pointeurs.

Considérez les extraits de code suivants :

// Unmarshaling into a reference variable
var animals Animal
err := json.Unmarshal(jsonBlob, &animals)

Ce code réussit à désorganiser les données JSON dans la variable de référence des animaux.

Cependant, un résultat différent se produit lors de la tentative de démarshal dans une variable de pointeur :

// Unmarshaling into a pointer variable
var animals *Animal
err := json.Unmarshal(jsonBlob, animals)

Dans ce cas, Unmarshal échoue avec une erreur obscure : "json: Unmarshal(nil *main.Animal )". Cette erreur se produit car les animaux sont un pointeur non initialisé.

La documentation d'Unmarshal indique que "Si le pointeur est nul, Unmarshal lui alloue une nouvelle valeur vers laquelle pointer." Cependant, ce comportement ne semble pas s'appliquer dans le cas de pointeurs non initialisés, comme en témoigne le message d'erreur.

Pour résoudre ce problème, il est recommandé d'initialiser la variable du pointeur animaux avant de tenter de le désorganiser :

animals = &Animal{}
err := json.Unmarshal(jsonBlob, animals)

Avec cette modification, le processus de démarshalage devrait réussir.

Notez que dans la documentation, le terme « démarshaling » est utilisé de manière cohérente.

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