Maison  >  Article  >  développement back-end  >  Pourquoi le partage de variables dans Go conduit-il à des sorties différentes en fonction de leur portée au sein de fonctions anonymes ?

Pourquoi le partage de variables dans Go conduit-il à des sorties différentes en fonction de leur portée au sein de fonctions anonymes ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-07 02:40:02550parcourir

Why does sharing variables in Go lead to different outputs depending on their scope within anonymous functions?

Partage de variables dans Go : comprendre la différence entre deux cas

Dans Go, les goroutines sont des tâches simultanées légères qui peuvent partager de la mémoire et communiquer en utilisant canaux. Le partage de variables entre les goroutines nécessite une manipulation minutieuse pour éviter les problèmes de course aux données.

Considérez le programme Go 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>

Une fois exécuté, ce programme imprime le résultat attendu :

4
0
1
3
2

Dans ce cas, chaque goroutine a sa propre copie de la variable x, qui est initialisée avec la valeur actuelle de i lors de la création de la goroutine. En effet, x est déclaré dans la fonction anonyme et sa portée est limitée à cette fonction.

Maintenant, considérons une légère modification du programme :

<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>

Cette fois, la sortie devient :

5
5
5
5
5

L'explication réside dans la façon dont la variable i est utilisée dans la goroutine. Puisque i est déclaré en dehors de la fonction anonyme, il est partagé entre toutes les goroutines. Dans ce cas, lorsque chaque goroutine exécute fmt.Println(i), elle imprime la valeur finale de i, qui est 5.

Pour vérifier cela, nous pouvons ajouter l'impression des adresses mémoire de x et i dans les goroutines. Le résultat montre que x a des adresses différentes pour chaque goroutine, alors que i a la même adresse pour toutes les goroutines :

0xc0420301e0
0xc0420301f8
0xc0420301e8
0xc0420301f0
0xc042030200
0xc042030208

En conclusion, la différence de partage de variable entre les deux cas découle de la portée de la variable déclaré dans la fonction anonyme. Lorsqu'une variable est déclarée dans la fonction anonyme, elle est privée pour cette goroutine. En revanche, une variable déclarée en dehors de la fonction anonyme est partagée entre toutes les goroutines.

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