Maison >développement back-end >Golang >Pourquoi la modification des valeurs à l'aide du mot-clé « range » de Go échoue-t-elle et comment les indices de tableau peuvent-ils fournir une solution ?

Pourquoi la modification des valeurs à l'aide du mot-clé « range » de Go échoue-t-elle et comment les indices de tableau peuvent-ils fournir une solution ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-27 18:27:15116parcourir

Why Does Modifying Values Using Go's `range` Keyword Fail, and How Can Array Indices Provide a Solution?

L'utilisation des indices de tableau sur des valeurs de plage

Lors de l'utilisation du mot-clé range avec des tableaux ou des tranches dans Go, il est essentiel de comprendre qu'il renvoie la clé et une copie de la valeur, pas la référence de valeur d'origine. Ce comportement peut prêter à confusion lorsque vous tentez de modifier des valeurs au sein de la collection au cours de l'itération.

Dans l'exemple fourni :

package main

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

Il est prévu que l'itération de plage attribue la chaîne "foo" à le champ de chaque élément du tableau. Cependant, lorsque la deuxième boucle imprime les valeurs mises à jour, tous les champs restent vides. Cela est dû à la sémantique de range basée sur la copie.

Pour modifier efficacement les valeurs dans le tableau pendant l'itération, il est nécessaire d'utiliser l'index du tableau au lieu de la variable de plage :

package main

import "fmt"

type MyType struct {
    field string
}

func main() {
    var array [10]MyType

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

    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}

Cette modification garantit que la variable d'index fait référence à l'élément réel du tableau, permettant des mises à jour de champ appropriées et une sortie correcte dans la deuxième boucle.

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