Mise à jour des valeurs de structure dans Go
Dans Go, les structures sont des types de valeur, ce qui signifie que l'attribution d'une structure à une autre copie ses valeurs plutôt que créer une référence. Cela peut entraîner un comportement inattendu lorsque vous essayez de modifier des valeurs dans une structure imbriquée.
Considérez l'extrait de 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" } }
L'intention est de mettre à jour le champ Type de chaque élément Mod dans la structure ftr basée sur une série de conditions. Cependant, une fois le code exécuté, le champ Type de chaque élément reste inchangé.
Ce comportement est dû au fait que la boucle de plage parcourt une copie de la tranche ftr.Mod. Par conséquent, toutes les modifications apportées à la variable d'élément dans la boucle ne sont pas reflétées dans la tranche ftr.Mod d'origine.
Pour résoudre ce problème et mettre à jour correctement les valeurs dans la structure ftr, vous pouvez utiliser une itération basée sur l'index. au lieu de s'étendre sur la tranche. Cela vous permet de modifier les valeurs directement dans la tranche d'origine :
type FTR struct { Id string Mod []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 itérant sur les indices de la tranche ftr.Mod et en modifiant directement les éléments correspondants, vous vous assurez que la structure ftr d'origine est mise à jour comme prévu.
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!