Abschlusserfassung in Go verzögern
Die Defer-Anweisung von Go kann verwendet werden, um eine Funktion auszuführen, nachdem die umgebende Funktion zurückgegeben wurde. Bei der Verwendung mit Abschlüssen ist es jedoch wichtig zu verstehen, wie die Parametererfassung funktioniert.
Das Problem
Beachten Sie den folgenden Code:
package main 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 }
Die Ausgabe des Codes ist:
0 1 2 3 4 4 3 2 1 0 4 4 4 4 4
Analyse
Hauptunterschiede
Der entscheidende Unterschied zwischen Teil 2 und 3 besteht darin, ob der Abschluss äußere Variablen erfasst oder nicht. In Teil 2 erfasst der Abschluss i, was eine Referenz auf eine äußere Variable ist. In Teil 3 hat der Abschluss keine äußeren Referenzen, sodass jeder Aufruf einen anderen Wert von n hat.
Zusätzliche Überlegungen
Das obige ist der detaillierte Inhalt vonWarum führt das Aufschieben der Schließungserfassung in Go zu unerwartetem Verhalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!