Heim >Backend-Entwicklung >Golang >Warum drucken Goroutinen unterschiedliche Werte, wenn sie Variablen in Go teilen?

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

Patricia Arquette
Patricia ArquetteOriginal
2024-11-05 19:23:02745Durchsuche

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")
}

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")
}

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")
}

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!

Stellungnahme:
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