Maison >développement back-end >Golang >Pourquoi la modification des valeurs de structure dans une boucle Go Range ne modifie-t-elle pas la tranche d'origine ?
Pourquoi les valeurs d'une plage de structure de type ne peuvent pas être modifiées
Dans Go, une plage de structure de type, comme une tranche, crée un vue des données sous-jacentes plutôt qu’une copie. Lors d'une itération sur une plage, toute modification apportée à la variable d'itération n'affecte que cette vue particulière, pas les données d'origine.
Pour comprendre cela, considérez l'extrait de code suivant :
type myStruct struct { Name string Count int } func main() { chartRecords := []myStruct{} for i := 0; i < 4; i++ { n := myStruct{Count: i, Name: fmt.Sprintf("Joe%2d", i)} chartRecords = append(chartRecords, n) } for _, elem := range chartRecords { elem.Count = 0 fmt.Println(elem) } fmt.Println(chartRecords) }
Ceci l'extrait de code parcourt la plage de chartRecords, modifie le champ Count de chaque variable d'itération à 0 et imprime la variable modifiée. Cependant, lorsque la tranche chartRecords d'origine est imprimée, elle montre que les valeurs du champ Count n'ont pas changé.
En effet, la boucle for avec une clause range crée une copie de chaque élément de la plage. Les modifications apportées à la copie n'affectent pas l'élément original. Pour modifier les éléments d'origine, vous devez les mettre à jour explicitement en accédant à leur index dans la tranche. Par exemple :
func main() { chartRecords := []myStruct{} for i := 0; i < 4; i++ { n := myStruct{Count: i, Name: fmt.Sprintf("Joe%2d", i)} chartRecords = append(chartRecords, n) } for i, elem := range chartRecords { chartRecords[i] = myStruct{Count: 0, Name: elem.Name} } fmt.Println(chartRecords) }
Dans cet exemple, la boucle for avec une clause range est utilisée pour parcourir la plage de chartRecords. Pour chaque itération, l'index est utilisé pour accéder à l'élément d'origine dans la tranche et la valeur de l'élément est mise à jour. Cette approche garantit que les modifications sont reflétées dans la tranche chartRecords 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!