Maison > développement back-end > Golang > Pourquoi `json.Unmarshal` échoue-t-il avec le type `interface{}` de Go ?

Pourquoi `json.Unmarshal` échoue-t-il avec le type `interface{}` de Go ?

Patricia Arquette
Libérer: 2024-12-04 14:24:12
original
891 Les gens l'ont consulté

Why Does `json.Unmarshal` Fail with Go's `interface{}` Type?

Interface Golang{} Incompréhension du type

Dans Go, le type interface{} permet aux variables de contenir des valeurs de n'importe quel type. Cependant, l'utilisation de interface{} comme type de paramètre de fonction peut conduire à des résultats inattendus lorsque vous travaillez avec json.Unmarshal.

Scénario 1 : type sans pointeur avec Unmarshal

Lors du passage d'un type non pointeur à un paramètre de fonction de type interface{}, json.Unmarshal ne pourra pas annuler le marshal dans la valeur. Au lieu de cela, il crée une nouvelle valeur map[string]interface{} et la stocke dans l'interface{}. En effet, json.Unmarshal nécessite un pointeur pour être désorganisé.

Scénario 2 : Type de pointeur avec Unmarshal

Si un pointeur vers la valeur est transmis à la place, json. Unmarshal fonctionnera comme prévu et décomposera les données dans la valeur indiquée. En effet, le pointeur permet au package json de modifier la valeur sous-jacente.

Scénario 3 : utilisation incorrecte du pointeur

Même lors de l'utilisation d'un type de pointeur, tenter de prendre son l'adresse lors du passage à json.Unmarshal (c'est-à-dire en utilisant &&i) peut conduire à un comportement inattendu. Dans ce cas, json.Unmarshal déréférencera le pointeur, trouvera une valeur d'interface{} contenant un non-pointeur et créera une nouvelle valeur map[string]interface{}.

Explication

interface{} n'est pas simplement un conteneur sans type mais plutôt un type en soi. Il enveloppe une valeur et son type. Passer un pointeur vers interface{} permet à d'autres packages de modifier la valeur sous-jacente, tandis que passer une valeur interface{} empêche directement la modification.

Bonnes pratiques

Pour éviter toute confusion , il est recommandé d'utiliser des pointeurs vers des valeurs au sein des interfaces plutôt que des pointeurs vers des interfaces. Cette approche garantit que le package json peut correctement regrouper les données dans le type souhaité.

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