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

Pourquoi les Golang Goroutines affichent-ils la même valeur lors du partage de variables ?

Linda Hamilton
Libérer: 2024-11-06 06:24:02
original
315 Les gens l'ont consulté

Why do Golang Goroutines Output the Same Value When Sharing Variables?

Comment Golang partage simultanément des variables

Cette discussion est centrée sur la compréhension de la façon dont les variables sont partagées entre plusieurs goroutines dans Go. Considérons 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>
Copier après la connexion

Lors de l'exécution, le résultat attendu est obtenu :

4
0
1
3
2
Copier après la connexion

Mais lorsqu'une modification subtile est apportée au 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>
Copier après la connexion

Le résultat obtenu est étonnamment uniforme :

5
5
5
5
5
Copier après la connexion

Explication

La distinction clé réside dans la portée des variables au sein des goroutines.

Dans le premier extrait de code, chaque itération de la boucle crée une nouvelle variable x et transmet sa valeur à la goroutine. Lorsque la goroutine s'exécute, elle dispose d'une copie locale de x et imprime sa valeur initiale. Ainsi, le résultat attendu est obtenu.

Cependant, dans le deuxième extrait de code, toutes les goroutines partagent une seule variable i. Lorsque la goroutine s'exécute, elle récupère la valeur finale de i une fois la boucle terminée. Par conséquent, toutes les goroutines génèrent la même valeur, 5.

Implications et meilleures pratiques

Ce comportement met en évidence l'importance cruciale de la portée variable lors de l'utilisation de goroutines. Pour garantir une exécution thread-safe, il est essentiel de prendre en compte la portée des variables et d'exploiter les primitives de synchronisation telles que les groupes d'attente (comme démontré dans les deux extraits de code) si nécessaire.

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!