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 la modification des valeurs de structure dans une boucle Go Range ne modifie-t-elle pas la tranche d'origine ?

Barbara Streisand
Libérer: 2024-12-20 19:05:11
original
277 Les gens l'ont consulté

Why Doesn't Modifying Struct Values in a Go Range Loop Change the Original Slice?

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)
}
Copier après la connexion

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)
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal