Maison >développement back-end >Golang >Pourquoi `json.Unmarshal` échoue-t-il avec le type `interface{}` de Go ?
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!