Maison > développement back-end > Golang > Pourquoi la modification des valeurs dans la boucle de plage de Go ne modifie-t-elle pas le tableau d'origine ?

Pourquoi la modification des valeurs dans la boucle de plage de Go ne modifie-t-elle pas le tableau d'origine ?

Susan Sarandon
Libérer: 2024-12-18 04:04:09
original
727 Les gens l'ont consulté

Why Doesn't Modifying Values in Go's Range Loop Change the Original Array?

Range fait référence à des valeurs à la place

Dans Go, le mot-clé range parcourt une séquence, telle qu'un tableau ou une tranche, et permet d'accéder à la fois à la clé (index) et à la valeur de chaque élément. Cependant, pour des raisons de performances, le mot-clé range opère sur une copie de la valeur d'origine. Cela signifie que toute modification apportée à la valeur renvoyée par range ne sera pas reflétée dans le tableau d'origine.

Exemple

Considérez le code suivant :

package main

import "fmt"

type MyType struct {
    field string
}

func main() {
    var array [10]MyType

    // Attempting to modify a value returned by range
    for _, e := range array {
        e.field = "foo"
    }

    // Printing the values after the range loop
    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}
Copier après la connexion

L'exécution de ce code imprimera "000000" pour tous les éléments car les modifications apportées à e.field à l'intérieur de la première boucle de plage sont appliquées à une copie et font n'affecte pas la valeur d'origine dans le tableau.

Solution

Pour modifier les valeurs d'un tableau à l'aide d'une boucle de plage, vous devez utiliser l'index du tableau au lieu de la valeur renvoyée par range. Ceci peut être réalisé en capturant l'index à l'aide de l'espace réservé _ dans la boucle de plage.

package main

import "fmt"

type MyType struct {
    field string
}

func main() {
    var array [10]MyType

    // Using the array index to modify values
    for idx, _ := range array {
        array[idx].field = "foo"
    }

    // Printing the values after the range loop
    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}
Copier après la connexion

Ce code modifié changera avec succès les valeurs du champ pour tous les éléments du tableau et imprimera "foo" pour chacun élément.

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