Maison >développement back-end >Golang >Pourquoi les boucles de concurrence Go avec des fonctions anonymes impriment-elles la même valeur ?
Comprendre le comportement inattendu de la concurrence Go avec les boucles For et les fonctions anonymes
Dans Go, lors de l'utilisation d'une boucle for pour créer des goroutines avec des fonctions anonymes fonctions, un comportement inattendu peut survenir, entraînant l'impression par toutes les goroutines de la même valeur. Pour comprendre ce comportement, analysons le code suivant :
func main() { var wg sync.WaitGroup for i := 1; i <= 5; i++ { wg.Add(1) go func() { fmt.Println(i) time.Sleep(time.Second * 1) wg.Done() }() } wg.Wait() }
Étonnamment, ce code affiche "6, 6, 6, 6, 6" au lieu du "2, 4, 1, 5, 3." Cette anomalie est attribuée aux fermetures créées par des fonctions anonymes.
Dans Go, les fermetures sont des fonctions qui capturent les variables de leur portée environnante. Dans le code ci-dessus, chaque fonction anonyme capture la variable i. Cependant, lorsque la boucle for itère, i est déjà à 5. Cela signifie que toutes les fermetures capturent la même valeur de i, qui est 6.
Pour résoudre ce problème, nous pouvons passer i comme argument à la fonction anonyme. Ce faisant, nous créons une copie locale de i qui est capturée par chaque fermeture, garantissant que chaque goroutine imprime la valeur correcte :
func main() { var wg sync.WaitGroup for i := 1; i <= 5; i++ { wg.Add(1) go func(i int) { fmt.Println(i) time.Sleep(time.Second * 1) wg.Done() }(i) } wg.Wait() }
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!