Sobes.tech
Senior

Que va afficher ce code et pourquoi ? ```go package main import "fmt" func main() { lst := []string{"a", "b", "c", "d"} for k, v := range lst { if k == 0 { lst = []string{"aa", "bb", "cc", "dd"} } fmt.Println(v) } } ```

sobes.tech IA

Réponse de l'IA

Le code affichera:

a
b
c
d

Pourquoi :

En Go, lorsque vous utilisez for k, v := range lst, le slice lst est copié par référence, mais l'itérateur fonctionne sur le slice original, qui était au moment du début de la boucle. Modifier la variable lst à l'intérieur de la boucle n'affecte pas l'itération.

C'est-à-dire qu'en entrant dans la boucle, lst contient {"a", "b", "c", "d"}, et c'est sur ce slice que l'itération se fait. La réaffectation de lst dans la boucle ne change pas l'ensemble des éléments parcourus.

Si vous souhaitez que les modifications du slice affectent la boucle, vous devriez utiliser une autre approche, par exemple une boucle avec des indices ou relancer la boucle.

Exemple :

for i := 0; i < len(lst); i++ {
    if i == 0 {
        lst = []string{"aa", "bb", "cc", "dd"}
    }
    fmt.Println(lst[i])
}

Dans ce cas, la sortie sera différente et peut provoquer une panique si la longueur change.