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 » ?
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 :
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!