Heim >Backend-Entwicklung >Golang >Warum führt das Teilen von Variablen in Go je nach Umfang innerhalb anonymer Funktionen zu unterschiedlichen Ausgaben?

Warum führt das Teilen von Variablen in Go je nach Umfang innerhalb anonymer Funktionen zu unterschiedlichen Ausgaben?

Barbara Streisand
Barbara StreisandOriginal
2024-11-07 02:40:02646Durchsuche

Why does sharing variables in Go lead to different outputs depending on their scope within anonymous functions?

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!

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