Verhalten gemeinsamer Goroutine-Variablen in Go
Frage:
Beim Erkunden der Parallelitätsfunktionen von Go Ein Entwickler ist beim Teilen von Variablen zwischen Goroutinen auf ein unerwartetes Verhalten gestoßen. Bei bestimmten Codeänderungen unterschieden sich die Ausgaben stark.
Im folgenden Codeausschnitt gibt jede Goroutine ihren entsprechenden x-Wert korrekt aus:
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") }
Allerdings ist eine leichte Änderung an der Code erzeugt ein einheitliches Ergebnis für alle Goroutinen:
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") }
Antwort:
Im ersten Snippet hat jede Goroutine eine neue Instanz der Variablen x. Dies liegt daran, dass x := i bei jeder Schleifeniteration eine neue Variable erstellt.
Um dies zu demonstrieren, können wir die Speicheradresse von x in jeder Goroutine drucken:
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") }
Diesen Code ausführen zeigt unterschiedliche Speicheradressen für jede Goroutine an.
Im zweiten Snippet wird die Variable i direkt in der anonymen Funktion referenziert, die an go func() übergeben wird. Das bedeutet, dass alle Goroutinen den gleichen i-Wert haben, was für die einheitliche Ausgabe sorgt.
Das obige ist der detaillierte Inhalt vonWarum drucken Goroutinen unterschiedliche Werte, wenn sie Variablen in Go teilen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!