Maison >développement back-end >Golang >Comment puis-je éviter un comportement inattendu lors de l'utilisation de « l'interface{} » de Go avec « json.Unmarshal » ?

Comment puis-je éviter un comportement inattendu lors de l'utilisation de « l'interface{} » de Go avec « json.Unmarshal » ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-21 08:06:12990parcourir

How Can I Avoid Unexpected Behavior When Using Go's `interface{}` with `json.Unmarshal`?

Interface Golang{} Incompréhension du type

Lors de l'utilisation du type interface{} comme paramètre de fonction, les développeurs rencontrent souvent un comportement inattendu, en particulier lorsque interagir avec les données JSON via json.Unmarshal.

Le Problème :

Dans Go, interface{} est un type qui peut contenir n'importe quelle valeur et n'importe quel type. Cependant, il est souvent interprété à tort comme un conteneur sans type. Ce malentendu survient dans des situations telles que :

func test(i interface{}) {
    j := []byte(`{ "foo": "bar" }`)
    json.Unmarshal(j, &i)
    fmt.Println(i)
}

func main() {
    test(Test{})
}

Comportement attendu :
Ce code tente de regrouper les données JSON dans une structure de test. Cependant, cela entraîne une conversion inattendue de la structure en un type map[string]interface{}.

Explication :

json.Unmarshal ne peut pas désorganiser JSON dans un valeur non-pointeur. Puisque i est une interface{} contenant une structure Test, elle est transmise comme adresse (&i) pour permettre la modification. Cependant, json.Unmarshal considère le pointeur interface{} comme un pointeur vers une valeur interface{} contenant la structure Test. Impossible de désorganiser en un non-pointeur, il crée par défaut une nouvelle valeur map[string]interface{} pour le JSON non marshalé.

La bonne approche :

Pour résoudre ce malentendu, considérez ce qui suit scénario :

func test(i *interface{}) {
    j := []byte(`{ "foo": "bar" }`)
    json.Unmarshal(j, i)
    fmt.Println(*i)
}

func main() {
    var i *Test
    test(&i)
}

Explication :

  • Passez un pointeur vers le paramètre interface{}, en enveloppant efficacement un pointeur dans une interface{}.
  • Dans la fonction, déréférencez le pointeur interface{} et transmettez-le directement à json.Unmarshal.
  • Puisque je tiens un pointeur vers la structure Test, json.Unmarshal désorganise correctement les données JSON dans la structure.

Conclusion :

interface{} est un type qui peut contenir n'importe quelle valeur, mais ce n'est pas simplement un espace réservé pour n'importe quelle valeur. taper. Pour éviter un comportement inattendu, gérez correctement les pointeurs lorsque vous utilisez interface{} comme paramètres de fonction, en particulier avec les opérations 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!

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