Maison >développement back-end >Golang >Comment les Goroutines de Golang partagent-elles des variables ?

Comment les Goroutines de Golang partagent-elles des variables ?

DDD
DDDoriginal
2024-11-05 14:11:02552parcourir

How Do Goroutines in Golang Share 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!

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