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 }
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
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
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!