Maison >développement back-end >Golang >Comment les Goroutines de Golang partagent-elles des variables ?
Comment les goroutines de Golang partagent des variables
Lors de l'apprentissage des fonctionnalités de concurrence de Golang, une question intéressante se pose : comment les goroutines partagent-elles des variables ? Un exemple simple illustre le comportement nuancé.
Exemple 1
Considérez le code 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>
Sortie :
<code class="text">4 0 1 3 2</code>
Chaque goroutine imprime correctement la valeur prévue.
Exemple 2
Maintenant, modifions légèrement le code :
<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>
Sortie :
<code class="text">5 5 5 5 5</code>
Explication
La différence entre ces exemples réside dans la façon dont la variable x est capturée par la goroutine. Dans l'exemple 1, une nouvelle variable locale x est créée au sein de chaque goroutine, leur permettant d'accéder à la valeur correcte.
Dans l'exemple 2, cependant, la goroutine capture la variable i, qui est une variable de boucle. Au fur et à mesure que la boucle itère, i est mis à jour, ce qui oblige toutes les goroutines à référencer la même valeur au moment de l'exécution.
Cette différence met en évidence l'importance de la portée des variables dans la simultanéité Go. Pour éviter les conditions de concurrence et les comportements imprévisibles, il est essentiel de capturer la valeur souhaitée dans une nouvelle variable locale.
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!