Unmarshaling JSON : dévoiler la différence entre référence et pointeur
Dans le domaine de l'analyse JSON, json.Unmarshal est un outil indispensable. Cependant, son comportement peut parfois laisser perplexe. Plus précisément, les utilisateurs peuvent se demander pourquoi le démarshaling fonctionne correctement lors de l'utilisation d'une référence mais échoue mystérieusement lors de l'utilisation d'un pointeur. Entrons dans le vif du sujet.
Référence vs pointeur
Dans le premier exemple, nous définissons « animaux » comme une variable de type Animal. Lorsque nous transmettons "&animaux" à Unmarshal, nous fournissons une référence à cette variable. Cela permet à Unmarshal de manipuler directement la structure d'origine.
En revanche, le deuxième exemple déclare "animaux" comme pointeur vers un type Animal. Les pointeurs contiennent l'adresse d'une autre variable, pas la variable elle-même. Passer "animaux" directement à Unmarshal signifie que nous passons un pointeur nul puisqu'il n'a pas été initialisé.
Le paradoxe
Assez curieusement, la documentation d'Unmarshal indique que il peut attribuer une nouvelle valeur au pointeur au cas où elle serait nulle. Alors, pourquoi le deuxième exemple échoue-t-il ?
Dévoilement de l'erreur
Le message d'erreur dans le deuxième exemple est en fait une InvalidUnmarshalError. Cette erreur est générée lorsque l'argument passé à Unmarshal est un pointeur non valide. Malgré la déclaration de la documentation, Unmarshal nécessite un pointeur non nul comme argument.
L'essentiel
Pour correctement Unmarshal JSON avec un pointeur, vous devez l'initialiser d'abord. Comme l'indique la documentation, cela peut être fait en attribuant simplement une valeur valide au pointeur avant d'appeler Unmarshal.
Unmarshalling vs. Unmarshaling
De plus, vous avez peut-être remarqué que la documentation utilise à la fois « unmarshaling » et « unmarshaling ». Bien que les deux orthographes soient considérées comme correctes, « unmarshaling » est l'usage le plus courant et préféré dans la communauté Go.
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!