Maison > développement back-end > Golang > Pourquoi les Goroutines impriment-elles des valeurs différentes lors du partage de variables dans Go ?

Pourquoi les Goroutines impriment-elles des valeurs différentes lors du partage de variables dans Go ?

Patricia Arquette
Libérer: 2024-11-05 19:23:02
original
743 Les gens l'ont consulté

Why Do Goroutines Print Different Values When Sharing Variables in Go?

Comportement des variables partagées Goroutine dans Go

Question :

Lors de l'exploration des fonctionnalités de concurrence de Go, un développeur a rencontré un comportement inattendu lors du partage de variables entre goroutines. En présence de certaines modifications de code, les sorties différaient nettement.

Dans l'extrait de code ci-dessous, chaque goroutine imprime correctement sa valeur x correspondante :

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")
}
Copier après la connexion

Cependant, une légère modification du le code produit un résultat uniforme pour toutes les goroutines :

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")
}
Copier après la connexion

Réponse :

Dans le premier extrait, chaque goroutine a une nouvelle instance de la variable x. En effet, x := i crée une nouvelle variable à chaque itération de boucle.

Pour démontrer cela, nous pouvons imprimer l'adresse mémoire de x à l'intérieur de chaque goroutine :

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(&amp;x)
        }()
    }
    wg.Wait()
    fmt.Println("Done")
}
Copier après la connexion

Exécuter ce code affichera différentes adresses mémoire pour chaque goroutine.

Dans le deuxième extrait, la variable i est directement référencée dans la fonction anonyme passée à go func(). Cela signifie que toutes les goroutines partagent la même valeur i, ce qui explique la sortie uniforme.

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