Maison > développement back-end > Golang > Pourquoi ma boucle Go Range ne modifie-t-elle pas les éléments du tableau ?

Pourquoi ma boucle Go Range ne modifie-t-elle pas les éléments du tableau ?

Barbara Streisand
Libérer: 2024-12-17 18:47:11
original
375 Les gens l'ont consulté

Why Does My Go Range Loop Not Modify Array Elements?

Adresses de retour au lieu de valeurs pour les références de plage

Considérez la situation dans laquelle une instruction de plage renvoie une copie d'une valeur au lieu de l'adresse d'origine . Cela peut conduire à un comportement inattendu, comme le montre le code Go suivant :

import "fmt"

type MyType struct {
    field string
}

func main() {
    var array [10]MyType

    for _, e := range array {
        e.field = "foo"
    }

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

Dans cet exemple, l'intention est de modifier la propriété "field" de chaque élément du tableau. Cependant, puisque l'instruction range renvoie une copie de la valeur, les modifications sont apportées à une copie locale et n'affectent pas le tableau d'origine. Par conséquent, la sortie affiche toutes les propriétés de « champ » comme ayant la valeur par défaut.

Pour résoudre ce problème, vous ne pouvez pas renvoyer l'adresse de l'élément dans une boucle de plage. Au lieu de cela, vous devez parcourir le tableau à l'aide de l'index, comme indiqué ci-dessous :

func main() {
    var array [10]MyType

    for idx, _ := range array {
        array[idx].field = "foo"
    }

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

En utilisant l'index au lieu de la valeur dans la boucle for, vous vous assurez que les modifications apportées à la propriété "field" sont reflétés dans le tableau 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