Sobes.tech
Senior

1.21 func main() { var nums []*int for i := 0; i < 10; i++ { nums = append(nums, &i) } for _, v := range nums { go func() { fmt.Println(v) }() } }

sobes.tech KI

Antwort von AI

In diesem Code gibt es einen klassischen Fehler bei der Schleifenbindung beim Arbeiten mit Goroutines und Zeigern.

Die Variable i im Loop ändert sich, und im Slice nums werden Zeiger auf die gleiche Variable i hinzugefügt. Am Ende zeigen alle Elemente in nums auf denselben Speicherort, der nach Abschluss der Schleife den Wert 9 enthält.

Beim Starten der Goroutines geben sie alle denselben Wert aus — die Adresse, auf die v zeigt, ist für alle Elemente gleich.

Um das zu beheben, muss innerhalb der Schleife eine neue Variable erstellt werden, sodass jeder Zeiger auf einen separaten Wert zeigt:

func main() {
    var nums []*int
    for i := 0; i < 10; i++ {
        val := i
        nums = append(nums, &val)
    }

    for _, v := range nums {
        go func(v *int) {
            fmt.Println(*v)
        }(v)
    }
}

Hier erstellen wir val innerhalb der Schleife und übergeben v als Parameter an eine anonyme Funktion, was eine korrekte Bindung des Wertes garantiert.