Heim >Backend-Entwicklung >Golang >Warum führt das Teilen von Variablen in Go je nach Umfang innerhalb anonymer Funktionen zu unterschiedlichen Ausgaben?
Variablen in Go teilen: Den Unterschied zwischen zwei Fällen verstehen
In Go sind Goroutinen leichte gleichzeitige Aufgaben, die Speicher teilen und mit ihnen kommunizieren können Kanäle. Die gemeinsame Nutzung von Variablen zwischen Goroutinen erfordert eine sorgfältige Handhabung, um Datenwettlaufprobleme zu vermeiden.
Betrachten Sie das folgende Go-Programm:
<code class="go">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") }</code>
Bei der Ausführung gibt dieses Programm die erwartete Ausgabe aus:
4 0 1 3 2
In diesem Fall verfügt jede Goroutine über eine eigene Kopie der Variablen x, die beim Erstellen der Goroutine mit dem aktuellen Wert von i initialisiert wird. Dies liegt daran, dass x innerhalb der anonymen Funktion deklariert wird und sein Gültigkeitsbereich auf diese Funktion beschränkt ist.
Betrachten Sie nun eine geringfügige Änderung des Programms:
<code class="go">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") }</code>
Diesmal die Ausgabe wird:
5 5 5 5 5
Die Erklärung liegt in der Art und Weise, wie die Variable i in der Goroutine verwendet wird. Da i außerhalb der anonymen Funktion deklariert wird, wird es von allen Goroutinen gemeinsam genutzt. Wenn in diesem Fall jede Goroutine fmt.Println(i) ausführt, druckt sie den Endwert von i, der 5 ist.
Um dies zu überprüfen, können wir das Drucken der Speicheradressen von x und i darin hinzufügen die Goroutinen. Die Ausgabe zeigt, dass x für jede Goroutine unterschiedliche Adressen hat, während i für alle Goroutinen dieselbe Adresse hat:
0xc0420301e0 0xc0420301f8 0xc0420301e8 0xc0420301f0 0xc042030200 0xc042030208
Zusammenfassend ergibt sich der Unterschied in der Variablenfreigabe zwischen den beiden Fällen aus dem Umfang der Variablen in der anonymen Funktion deklariert. Wenn eine Variable innerhalb der anonymen Funktion deklariert wird, ist sie für diese Goroutine privat. Andererseits wird eine außerhalb der anonymen Funktion deklarierte Variable von allen Goroutinen gemeinsam genutzt.
Das obige ist der detaillierte Inhalt vonWarum führt das Teilen von Variablen in Go je nach Umfang innerhalb anonymer Funktionen zu unterschiedlichen Ausgaben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!