


Warum geben Go-Parallelitätsschleifen mit anonymen Funktionen denselben Wert aus?
Nov 24, 2024 am 08:41 AMVerstehen 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!

Heißer Artikel

Hot-Tools-Tags

Heißer Artikel

Heiße Artikel -Tags

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

GO Language Pack Import: Was ist der Unterschied zwischen Unterstrich und ohne Unterstrich?

Wie schreibe ich Scheinobjekte und Stubs zum Testen in Go?

Wie kann ich kurzfristige Informationsübertragung zwischen Seiten im BeEGO-Framework implementieren?

Wie kann ich benutzerdefinierte Typ -Einschränkungen für Generika in Go definieren?

Wie kann ich Tracing -Tools verwenden, um den Ausführungsfluss meiner GO -Anwendungen zu verstehen?

Wie schreibe ich Dateien in Go Language bequem?

Wie kann ich Linter und statische Analyse -Tools verwenden, um die Qualität und Wartbarkeit meines GO -Codes zu verbessern?

Wie konvertieren Sie die Liste der MySQL -Abfrageergebnisse in eine benutzerdefinierte Struktur -Slice in Go -Sprache?
