Heim > Backend-Entwicklung > Golang > Warum geben Go-Parallelitätsschleifen mit anonymen Funktionen denselben Wert aus?

Warum geben Go-Parallelitätsschleifen mit anonymen Funktionen denselben Wert aus?

Susan Sarandon
Freigeben: 2024-11-24 08:41:25
Original
327 Leute haben es durchsucht

Why Do Go Concurrency Loops with Anonymous Functions Print the Same Value?

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()
}
Nach dem Login kopieren

Ü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()
}
Nach dem Login kopieren

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!

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