Maison >développement back-end >Golang >Pourquoi `json.Unmarshal` modifie-t-il ma structure de manière inattendue lors de l'utilisation de `interface{}` ?

Pourquoi `json.Unmarshal` modifie-t-il ma structure de manière inattendue lors de l'utilisation de `interface{}` ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-12 19:53:11219parcourir

Why Does `json.Unmarshal` Unexpectedly Change My Struct When Using `interface{}`?

Idées fausses sur l'interface de Go{} Type

Arrière-plan

Le type d'interface{}, un aspect important de la programmation Go, permet une gestion dynamique des valeurs, mais son utilisation peut souvent conduire à des malentendus.

Un bug inattendu avec json.Unmarshal

Une idée fausse courante surgit lors de l'utilisation de interface{} comme paramètre de fonction et de la rencontre d'un problème avec json.Unmarshal. L'extrait de code suivant illustre ce bug :

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

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

type Test struct {
    Foo string
}

Lors de son exécution, ce code transforme de manière inattendue la struct Test{} en une map[string]interface{} après avoir été désorganisé, comme le montre le résultat :

main.Test
*interface {}
map[string]interface {}

Comprendre l'idée fausse

Le malentendu réside dans la nature du type d'interface{}. Ce n'est pas un conteneur vide comme certains pourraient le supposer, mais plutôt un wrapper pour une paire de types valeur. Lorsque le Test{} sans pointeur est transmis à test(), la fonction json.Unmarshal attend un pointeur, l'amenant à créer une nouvelle valeur map[string]interface{} à la place.

Pour résoudre ce problème , il faut passer un pointeur vers le paramètre interface{}.

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

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

Cette modification garantit qu'un pointeur vers un pointeur est passé à la fonction, permettant à json.Unmarshal pour désassembler correctement les données JSON.

Conclusion

Il est crucial de se rappeler que l'interface{} nécessite une utilisation prudente pour éviter un comportement inattendu. Comprendre son implémentation sous-jacente et ses implications sur des fonctions comme json.Unmarshal est essentiel pour un développement Go efficace.

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