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
Barbara Streisandoriginal
2024-12-20 19:05:11315parcourir

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)
}

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!

Déclaration:
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