Heim >Backend-Entwicklung >Golang >Wie teilen Goroutinen in Golang Variablen?
Wie Goroutinen in Golang Variablen teilen
Beim Erlernen der Parallelitätsfunktionen von Golang stellt sich eine interessante Frage: Wie teilen Goroutinen Variablen? Ein einfaches Beispiel veranschaulicht das differenzierte Verhalten.
Beispiel 1
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>
Ausgabe:
<code class="text">4 0 1 3 2</code>
Jede Goroutine gibt den beabsichtigten Wert korrekt aus.
Beispiel 2
Jetzt ändern wir den Code leicht:
<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>
Ausgabe:
<code class="text">5 5 5 5 5</code>
Erklärung
Der Unterschied zwischen diesen Beispielen liegt darin, wie die Variable x von der Goroutine erfasst wird. In Beispiel 1 wird in jeder Goroutine eine neue lokale Variable x erstellt, die es ihnen ermöglicht, auf den richtigen Wert zuzugreifen.
In Beispiel 2 erfasst die Goroutine jedoch die Variable i, die eine Schleifenvariable ist. Während die Schleife iteriert, wird i aktualisiert, was dazu führt, dass alle Goroutinen zur Laufzeit auf denselben Wert verweisen.
Dieser Unterschied unterstreicht die Bedeutung des Variablenbereichs in der Go-Parallelität. Um Race Conditions und unvorhersehbares Verhalten zu vermeiden, ist es wichtig, den beabsichtigten Wert in einer neuen lokalen Variablen zu erfassen.
Das obige ist der detaillierte Inhalt vonWie teilen Goroutinen in Golang Variablen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!