Verstehen des unerwarteten Verhaltens der Go-Parallelität mit For-Schleifen und anonymen Funktionen
In Go, wenn eine for-Schleife verwendet wird, um Goroutinen mit anonymen Funktionen zu erstellen Funktionen kann ein unerwartetes Verhalten auftreten, das dazu führt, dass alle Goroutinen denselben Wert ausgeben. Um dieses Verhalten zu verstehen, analysieren wir den folgenden Code:
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() }
Überraschenderweise gibt dieser Code „6, 6, 6, 6, 6“ anstelle der erwarteten „2, 4, 1, 5, 3." Diese Anomalie wird auf die durch anonyme Funktionen erstellten Abschlüsse zurückgeführt.
In Go sind Abschlüsse Funktionen, die Variablen aus ihrem umgebenden Bereich erfassen. Im obigen Code erfasst jede anonyme Funktion die Variable i. Wenn die for-Schleife jedoch iteriert, ist i bereits bei 5. Das bedeutet, dass alle Abschlüsse den gleichen Wert von i erfassen, nämlich 6.
Um dieses Problem zu lösen, können wir i als Argument an übergeben die anonyme Funktion. Auf diese Weise erstellen wir eine lokale Kopie von i, die von jedem Abschluss erfasst wird, und stellen so sicher, dass jede Goroutine den richtigen Wert ausgibt:
func main() { var wg sync.WaitGroup for i := 1; i <= 5; i++ { wg.Add(1) go func(i int) { fmt.Println(i) time.Sleep(time.Second * 1) wg.Done() }(i) } wg.Wait() }
Das obige ist der detaillierte Inhalt vonWarum geben Go-Parallelitätsschleifen mit anonymen Funktionen denselben Wert aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!