Warum drucken Goroutinen unterschiedliche Werte, wenn sie Variablen in Go teilen?

Patricia Arquette
Freigeben: 2024-11-05 19:23:02
Original
653 Leute haben es durchsucht

Why Do Goroutines Print Different Values When Sharing Variables in Go?

Verhalten gemeinsamer Goroutine-Variablen in Go

Frage:

Beim Erkunden der Parallelitätsfunktionen von Go Ein Entwickler ist beim Teilen von Variablen zwischen Goroutinen auf ein unerwartetes Verhalten gestoßen. Bei bestimmten Codeänderungen unterschieden sich die Ausgaben stark.

Im folgenden Codeausschnitt gibt jede Goroutine ihren entsprechenden x-Wert korrekt aus:

package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup

    for i := 0; i < 5; i++ {
        wg.Add(1)

        x := i

        go func() {
            defer wg.Done()
            fmt.Println(x)
        }()

    }

    wg.Wait()
    fmt.Println("Done")
}
Nach dem Login kopieren

Allerdings ist eine leichte Änderung an der Code erzeugt ein einheitliches Ergebnis für alle Goroutinen:

package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup

    for i := 0; i < 5; i++ {
        wg.Add(1)

        go func() {
            defer wg.Done()
            fmt.Println(i)
        }()

    }

    wg.Wait()
    fmt.Println("Done")
}
Nach dem Login kopieren

Antwort:

Im ersten Snippet hat jede Goroutine eine neue Instanz der Variablen x. Dies liegt daran, dass x := i bei jeder Schleifeniteration eine neue Variable erstellt.

Um dies zu demonstrieren, können wir die Speicheradresse von x in jeder Goroutine drucken:

package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 5; i++ {
        wg.Add(1)
        x := i
        go func() {
            defer wg.Done()
            fmt.Println(&amp;x)
        }()
    }
    wg.Wait()
    fmt.Println("Done")
}
Nach dem Login kopieren

Diesen Code ausführen zeigt unterschiedliche Speicheradressen für jede Goroutine an.

Im zweiten Snippet wird die Variable i direkt in der anonymen Funktion referenziert, die an go func() übergeben wird. Das bedeutet, dass alle Goroutinen den gleichen i-Wert haben, was für die einheitliche Ausgabe sorgt.

Das obige ist der detaillierte Inhalt vonWarum drucken Goroutinen unterschiedliche Werte, wenn sie Variablen in Go teilen?. 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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!