Closure Capture in Golangs Defer-Anweisung
Golangs Defer-Anweisung ermöglicht die Ausführung von Bereinigungsaktionen nach der Rückkehr einer Funktion. Im Gegensatz zu den meisten Sprachen erfasst der von defer erstellte Abschluss jedoch nicht den aktuellen Status der Variablen in der umgebenden Funktion, sondern wertet sie stattdessen aus, wenn die defer-Anweisung ausgeführt wird.
Teil 2 vs. Teil verstehen 3
Im angegebenen Code liegt der Unterschied zwischen Teil 2 und Teil 3 darin, wie der Abschluss die Variable erfasst i.
Teil 2:
for i := range whatever { defer func() { fmt.Println(i) }() }
In Teil 2 erfasst der Abschluss die Variable i direkt. Wenn der Code im Abschluss ausgeführt wird (nachdem die Schleife beendet ist), wird der Wert von i durch die letzte Iteration der Schleife bestimmt, die 4 ist. Aus diesem Grund gibt Teil 2 „44444“ aus.
Teil 3:
for i := range whatever { defer func(n int) { fmt.Println(n) }(i) }
In Teil 3 erfasst der Abschluss i nicht direkt, sondern erstellt stattdessen eine neue Variable n und weist ihr die zu Wert von i zum Zeitpunkt der Ausführung der Defer-Anweisung. Da die Defer-Anweisung für jede Iteration der Schleife ausgeführt wird, hat jeder Abschluss einen anderen Wert für n. Dies führt zur Ausgabe „43210“.
Wichtiger Punkt:
Das Schlüsselkonzept, das Sie sich merken sollten, ist, dass der Code innerhalb des Abschlusses in „Defer“ nicht ausgeführt wird, wenn der „Defer“ ausgeführt wird Anweisung wird ausgeführt. Stattdessen werden die Ausdrücke, die zur Bestimmung der Argumente des Abschlusses verwendet werden (z. B. i in diesem Fall), ausgewertet, wenn die Defer-Anweisung ausgeführt wird.
Das obige ist der detaillierte Inhalt vonWie erfasst Golangs Defer-Anweisung Variablen in einer Schleife?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!