Maison > développement back-end > Golang > le corps du texte

Pourquoi les Go Goroutines lancées dans une boucle For avec des fonctions anonymes impriment-elles toutes la même valeur ?

Linda Hamilton
Libérer: 2024-11-23 18:22:17
original
320 Les gens l'ont consulté

Why Do Go Goroutines Launched in a For Loop with Anonymous Functions All Print the Same Value?

Comportement inattendu de la concurrence Go avec les boucles for et les fonctions anonymes

Dans la concurrence Go, il est essentiel de comprendre le comportement des fonctions anonymes au lancement comme des goroutines. Cela a été démontré lors de la tentative d'utilisation de sync.WaitGroup pour attendre que plusieurs goroutines terminent les téléchargements Amazon S3.

Le code initial utilisait une boucle for pour lancer les goroutines, mais le résultat montrait étonnamment que toutes les goroutines imprimaient la même valeur ( 6). Cela s'est produit parce que les goroutines n'étaient planifiées qu'après la fin de la boucle for, donc la valeur de i était 6 lors de leur exécution.

Le code a été modifié pour passer i comme argument à la fonction anonyme, ce qui a donné le comportement souhaité. En effet, passer i crée une nouvelle variable et capture la valeur au moment de l'invocation.

Ce comportement est conforme à la FAQ Go, qui indique que lorsqu'une fonction anonyme est lancée en tant que goroutine, elle capture l'état de ses variables environnantes au moment de la création. Passer i comme argument copie efficacement la valeur à ce moment-là.

Par conséquent, lorsque vous utilisez des fonctions anonymes dans des goroutines, il est important de prendre en compte le comportement de fermeture et d'utiliser des techniques telles que le passage de valeur pour obtenir le comportement de concurrence souhaité.

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