Maison >développement back-end >Golang >Pourquoi la mise à jour des valeurs dans une structure Go à l'intérieur d'une boucle ne modifie-t-elle pas la structure d'origine ?
Mettre à jour la valeur dans Struct
Lorsque vous traitez des structures, la mise à jour des valeurs peut poser des défis. Considérez le code suivant :
ftr := FTR{} err = yaml.Unmarshal([]byte(yamlFile), &ftr) for index, element := range ftr.Mod { switch element.Type { case “aaa”, “bbbb”: element.Type = "cccc” case "htr”: element.Type = "com" case "no": element.Type = "jnodejs" case "jdb”: element.Type = "tomcat" } }
Après l'exécution de cette boucle, la structure ftr d'origine n'est pas modifiée, malgré les mises à jour apparentes au sein de la boucle. Quel pourrait être le problème ?
Le problème : les pointeurs et le déballage de la structure
Dans Go, passer une structure à une fonction par valeur crée une copie de la structure, contrairement en passant par référence, qui fournit un pointeur vers la structure d'origine. Dans ce cas, itérer sur ftr.Mod à l'aide de range crée des copies des éléments Mod, ce qui signifie que toutes les modifications apportées dans la boucle ne sont pas reflétées dans la structure ftr d'origine.
La solution : utiliser des indices et des pointeurs
Pour modifier la structure ftr d'origine, suivez ces étapes :
Voici le code modifié :
type FTR struct { Id string Mod []*Mod // Use pointers for Mod } for index := range ftr.Mod{ switch (*ftr.Mod[index]).Type { case “aaa”, “bbbb”: (*ftr.Mod[index]).Type = "cccc” case "htr”: (*ftr.Mod[index]).Type = "com" case "no": (*ftr.Mod[index]).Type = "jnodejs" case "jdb”: (*ftr.Mod[index]).Type = "tomcat" } }
En utilisant des pointeurs, vous pouvez directement modifier les valeurs dans la structure ftr d'origine.
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!