Wie erfasst Golangs Defer-Anweisung Variablen in einer Schleife?

DDD
Freigeben: 2024-11-11 22:13:02
Original
365 Leute haben es durchsucht

How Does Golang's Defer Statement Capture Variables in a Loop?

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) }()
}
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

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!

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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage