Partage de variables dans Go : comprendre la différence entre deux cas
Dans Go, les goroutines sont des tâches simultanées légères qui peuvent partager de la mémoire et communiquer en utilisant canaux. Le partage de variables entre les goroutines nécessite une manipulation minutieuse pour éviter les problèmes de course aux données.
Considérez le programme Go suivant :
<code class="go">package main import ( "fmt" "sync" ) func main() { var wg sync.WaitGroup for i := 0; i < 5; i++ { wg.Add(1) x := i go func() { defer wg.Done() fmt.Println(x) }() } wg.Wait() fmt.Println("Done") }</code>
Une fois exécuté, ce programme imprime le résultat attendu :
4 0 1 3 2
Dans ce cas, chaque goroutine a sa propre copie de la variable x, qui est initialisée avec la valeur actuelle de i lors de la création de la goroutine. En effet, x est déclaré dans la fonction anonyme et sa portée est limitée à cette fonction.
Maintenant, considérons une légère modification du programme :
<code class="go">package main import ( "fmt" "sync" ) func main() { var wg sync.WaitGroup for i := 0; i < 5; i++ { wg.Add(1) go func() { defer wg.Done() fmt.Println(i) }() } wg.Wait() fmt.Println("Done") }</code>
Cette fois, la sortie devient :
5 5 5 5 5
L'explication réside dans la façon dont la variable i est utilisée dans la goroutine. Puisque i est déclaré en dehors de la fonction anonyme, il est partagé entre toutes les goroutines. Dans ce cas, lorsque chaque goroutine exécute fmt.Println(i), elle imprime la valeur finale de i, qui est 5.
Pour vérifier cela, nous pouvons ajouter l'impression des adresses mémoire de x et i dans les goroutines. Le résultat montre que x a des adresses différentes pour chaque goroutine, alors que i a la même adresse pour toutes les goroutines :
0xc0420301e0 0xc0420301f8 0xc0420301e8 0xc0420301f0 0xc042030200 0xc042030208
En conclusion, la différence de partage de variable entre les deux cas découle de la portée de la variable déclaré dans la fonction anonyme. Lorsqu'une variable est déclarée dans la fonction anonyme, elle est privée pour cette goroutine. En revanche, une variable déclarée en dehors de la fonction anonyme est partagée entre toutes les goroutines.
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!