Beim Schreiben von gleichzeitigem Code in Go ist es wichtig, das Verhalten anonymer Funktionen zu verstehen. In diesem Beispiel untersuchen wir ein Szenario, in dem eine for-Schleife und eine anonyme Funktion eine unerwartete Ausgabe erzeugen.
func main() { var wg sync.WaitGroup for i := 1; i <= 5; i++ { wg.Add(1) go func() { fmt.Println(i) time.Sleep(time.Second * 1) wg.Done() }() } wg.Wait() }
Das Ausführen dieses Codes gibt überraschenderweise „6, 6, 6, 6, 6“ anstelle der erwarteten Reihenfolge „2, 4, 1, 5, 3“. Dies liegt daran, dass die for-Schleife die Variable i weiterhin aktualisiert, nachdem die Goroutinen gestartet wurden.
Die anonyme Funktion im obigen Code ist ein Abschluss. Abschlüsse erfassen die Variablen, die zum Zeitpunkt ihrer Erstellung im Hauptteil der Funktion verwendet werden. In diesem Fall wird die Variable i beim Start der Goroutine erfasst. Die Schleife aktualisiert i jedoch weiterhin, nachdem die Goroutine gestartet wurde.
Da die Schleife erst endet, wenn i größer als 5 ist, ist i 6, wenn die Goroutinen schließlich ausgeführt werden. Daher gibt jede Goroutine den Wert von i aus, der im Abschluss erfasst wurde, in diesem Fall also 6. Die erwartete Ausgabe wird nur beobachtet, wenn die Variable i als Argument an die anonyme Funktion übergeben wird, wodurch zum Zeitpunkt des Aufrufs effektiv eine Kopie des Werts erstellt wird.
Das obige ist der detaillierte Inhalt vonWarum gibt mein Go-Parallelitätsbeispiel „6, 6, 6, 6, 6' anstelle der erwarteten Reihenfolge aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!