Maison >développement back-end >Golang >Pourquoi les boucles de concurrence Go avec des fonctions anonymes impriment-elles la même valeur ?

Pourquoi les boucles de concurrence Go avec des fonctions anonymes impriment-elles la même valeur ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-24 08:41:25371parcourir

Why Do Go Concurrency Loops with Anonymous Functions Print the Same Value?

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!

Déclaration:
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