Heim  >  Artikel  >  Backend-Entwicklung  >  Warum geben Golang-Goroutinen beim Teilen von Variablen denselben Wert aus?

Warum geben Golang-Goroutinen beim Teilen von Variablen denselben Wert aus?

Linda Hamilton
Linda HamiltonOriginal
2024-11-06 06:24:02325Durchsuche

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

Wie Golang Variablen gleichzeitig teilt

Diese Diskussion konzentriert sich darauf, zu verstehen, wie Variablen zwischen mehreren Goroutinen in Go gemeinsam genutzt werden. Betrachten Sie den folgenden Code:

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

Bei der Ausführung wird die erwartete Ausgabe erhalten:

4
0
1
3
2

Aber wenn eine geringfügige Änderung am Code vorgenommen wird:

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

Die resultierende Ausgabe ist unerwartet einheitlich:

5
5
5
5
5

Erklärung

Der Hauptunterschied liegt im Umfang der Variablen innerhalb von Goroutinen.

In Beim ersten Codeausschnitt erstellt jede Iteration der Schleife eine neue Variable x und übergibt ihren Wert an die Goroutine. Wenn die Goroutine ausgeführt wird, verfügt sie über eine lokale Kopie von x und gibt ihren Anfangswert aus. Somit wird die erwartete Ausgabe erhalten.

Im zweiten Codeausschnitt teilen sich jedoch alle Goroutinen eine einzige Variable i. Wenn die Goroutine ausgeführt wird, ruft sie den Endwert von i ab, nachdem die Schleife abgeschlossen ist. Folglich geben alle Goroutinen den gleichen Wert aus, 5.

Implikationen und Best Practices

Dieses Verhalten unterstreicht die entscheidende Bedeutung des Variablenbereichs bei der Verwendung von Goroutinen. Um eine threadsichere Ausführung zu gewährleisten, ist es wichtig, den Umfang der Variablen zu berücksichtigen und bei Bedarf Synchronisierungsprimitive wie Wartegruppen zu nutzen (wie in beiden Codeausschnitten gezeigt).

Das obige ist der detaillierte Inhalt vonWarum geben Golang-Goroutinen beim Teilen von Variablen denselben Wert aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn