Wie werden Erfassungsparameter in Go-Abschlüssen zurückgestellt?

Mary-Kate Olsen
Freigeben: 2024-11-10 17:53:02
Original
345 Leute haben es durchsucht

How Does Defer Capture Parameters in Go Closures?

Defer Capture in Go mit oder ohne Parameter

In Go kann das Schlüsselwort defer verwendet werden, um die Ausführung einer Funktion zu verschieben, bis die umgebende Funktion zurückkehrt. Bei Verwendung mit anonymen Abschlüssen kann das Verhalten jedoch variieren, je nachdem, wie der Abschluss seine Parameter erfasst.

Beachten Sie den folgenden Code:

import "fmt"

func main() {
    var whatever [5]struct{}

    for i := range whatever {
        fmt.Println(i)
    } // part 1

    for i := range whatever {
        defer func() { fmt.Println(i) }()
    } // part 2

    for i := range whatever {
        defer func(n int) { fmt.Println(n) }(i)
    } // part 3
}
Nach dem Login kopieren

Teil 2: Abschluss ohne Parameter

In Teil 2 erfasst der Abschluss keine Parameter. Dies bedeutet, dass die Variable i beim Ausführen des Abschlusses den Wert hat, den sie hatte, als die Defer-Anweisung ausgeführt wurde. In diesem Fall habe ich den Wert der letzten Iteration der for-Schleife, der 4 ist. Folglich lautet die Ausgabe von Teil 2:

4 4 4 4 4
Nach dem Login kopieren

Teil 3: Abschluss mit Parameter

In Teil 3 erfasst der Abschluss den Parameter n, der beim Erstellen des Abschlusses auf den Wert von i initialisiert wird. Das bedeutet, dass n beim Ausführen des Abschlusses den Wert hat, den es hatte, als die Defer-Anweisung ausgeführt wurde. In diesem Fall erfasst jeder Abschluss einen anderen Wert von i, was zur folgenden Ausgabe führt:

4 3 2 1 0
Nach dem Login kopieren

Schlussfolgerung

Der Hauptunterschied zwischen Teil 2 und Teil 3 besteht darin, dass Teil 2 das i erfasst variabel, während Teil 3 dies nicht tut. Dies wirkt sich auf das Verhalten des Abschlusses bei seiner Ausführung aus und führt zu unterschiedlichen Ausgaben.

Das obige ist der detaillierte Inhalt vonWie werden Erfassungsparameter in Go-Abschlüssen zurückgestellt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage