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