Warum geben Go-Goroutinen, die in einer For-Schleife mit anonymen Funktionen gestartet werden, alle denselben Wert aus?

Linda Hamilton
Freigeben: 2024-11-23 18:22:17
Original
347 Leute haben es durchsucht

Why Do Go Goroutines Launched in a For Loop with Anonymous Functions All Print the Same Value?

Unerwartetes Verhalten der Go-Parallelität mit for-Schleifen und anonymen Funktionen

Bei der Go-Parallelität ist es wichtig, das Verhalten anonymer Funktionen beim Start zu verstehen als Goroutinen. Dies wurde gezeigt, als versucht wurde, sync.WaitGroup zu verwenden, um darauf zu warten, dass mehrere Goroutinen den Amazon S3-Upload abschließen.

Der ursprüngliche Code verwendete eine for-Schleife zum Starten von Goroutinen, aber die Ausgabe zeigte überraschenderweise, dass alle Goroutinen denselben Wert druckten ( 6). Dies geschah, weil die Goroutinen erst nach Abschluss der for-Schleife geplant wurden, sodass der Wert von i bei ihrer Ausführung 6 war.

Der Code wurde geändert, um i als Argument an die anonyme Funktion zu übergeben, was zu … das gewünschte Verhalten. Dies liegt daran, dass durch die Übergabe von i eine neue Variable erstellt und der Wert zum Zeitpunkt des Aufrufs erfasst wird.

Dieses Verhalten steht im Einklang mit der Go-FAQ, die besagt, dass eine anonyme Funktion, wenn sie als Goroutine gestartet wird, den Status erfasst seiner umgebenden Variablen zum Zeitpunkt der Erstellung. Durch die Übergabe von i als Argument wird der Wert in diesem Moment effektiv kopiert.

Daher ist es bei der Verwendung anonymer Funktionen in Goroutinen wichtig, das Abschlussverhalten zu berücksichtigen und Techniken wie die Wertübergabe zu verwenden, um das gewünschte Parallelitätsverhalten zu erreichen.

Das obige ist der detaillierte Inhalt vonWarum geben Go-Goroutinen, die in einer For-Schleife mit anonymen Funktionen gestartet werden, alle denselben Wert aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage