Heim  >  Artikel  >  Backend-Entwicklung  >  Wie behandelt die „defer'-Anweisung von Go Abschlussparameter?

Wie behandelt die „defer'-Anweisung von Go Abschlussparameter?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-11 22:08:02691Durchsuche

How Does Go's `defer` Statement Handle Closure Parameters?

Gos „defer“-Abschluss: Die Erfassung des Parameters des Abschlusses verstehen

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:

  • Defer-Anweisungen Verzögern Sie die Ausführung von Funktionsaufrufen, bis die umgebende Funktion zurückkehrt.
  • Wenn ein Abschluss einen Parameter erfasst, wird der Wert des Parameters zum Zeitpunkt der Erstellung des Abschlusses eingefroren.
  • Wenn ein Abschluss nicht erfasst Bei allen äußeren Variablen werden deren Parameter ausgewertet, wenn die Defer-Anweisung ausgeführt wird.
  • Die Ausführungsreihenfolge von Defer-Anweisungen ist Last-In-First-Out (LIFO).

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!

Stellungnahme:
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