In Go ermöglicht die „defer“-Anweisung Funktionen, die Ausführung eines Funktionsaufrufs bis zum zu verschieben umgebende Funktion kehrt zurück. Dieses Verhalten kann zu unerwarteten Ergebnissen führen, wenn die Defer-Anweisung die Parameter des Abschlusses erfasst.
Teil 2 vs. Teil 3: Der erfasste Parameter
Beachten Sie den folgenden Code:
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
Teil 2:
In „Teil 2“ erstellt die Defer-Anweisung einen Abschluss, der die Variable „i“ erfasst. Wenn der Abschluss ausgeführt wird, hat die Variable „i“ den Wert, den sie in der letzten Iteration der Bereichsanweisung hatte, nämlich 4. Daher ist die Ausgabe „44444“.
Teil 3:
In „Teil 3“ erstellt die Defer-Anweisung einen Abschluss, der keine äußeren Variablen erfasst. Der „n“-Parameter des Abschlusses wird ausgewertet, wenn die Defer-Anweisung ausgeführt wird, und erhält in diesem Moment den Wert „i“. Dies führt zur gewünschten Ausgabe von „43210“, da jeder verzögerte Funktionsaufruf einen anderen Wert für „n“ verwendet.
Wichtige Punkte:
Verstehen der Erfassung Das Verhalten von Defer-Anweisungen ist entscheidend, um unerwartete Ergebnisse in Ihrem Go-Code zu vermeiden.
Das obige ist der detaillierte Inhalt vonWie behandelt die „defer'-Anweisung von Go Abschlussparameter?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!