Wie Golang Variablen gleichzeitig teilt
Diese Diskussion konzentriert sich darauf, zu verstehen, wie Variablen zwischen mehreren Goroutinen in Go gemeinsam genutzt werden. Betrachten Sie den folgenden Code:
<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 wird die erwartete Ausgabe erhalten:
4 0 1 3 2
Aber wenn eine geringfügige Änderung am Code vorgenommen wird:
<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>
Die resultierende Ausgabe ist unerwartet einheitlich:
5 5 5 5 5
Erklärung
Der Hauptunterschied liegt im Umfang der Variablen innerhalb von Goroutinen.
In Beim ersten Codeausschnitt erstellt jede Iteration der Schleife eine neue Variable x und übergibt ihren Wert an die Goroutine. Wenn die Goroutine ausgeführt wird, verfügt sie über eine lokale Kopie von x und gibt ihren Anfangswert aus. Somit wird die erwartete Ausgabe erhalten.
Im zweiten Codeausschnitt teilen sich jedoch alle Goroutinen eine einzige Variable i. Wenn die Goroutine ausgeführt wird, ruft sie den Endwert von i ab, nachdem die Schleife abgeschlossen ist. Folglich geben alle Goroutinen den gleichen Wert aus, 5.
Implikationen und Best Practices
Dieses Verhalten unterstreicht die entscheidende Bedeutung des Variablenbereichs bei der Verwendung von Goroutinen. Um eine threadsichere Ausführung zu gewährleisten, ist es wichtig, den Umfang der Variablen zu berücksichtigen und bei Bedarf Synchronisierungsprimitive wie Wartegruppen zu nutzen (wie in beiden Codeausschnitten gezeigt).
Das obige ist der detaillierte Inhalt vonWarum geben Golang-Goroutinen beim Teilen von Variablen denselben Wert aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!