Heim >Backend-Entwicklung >Golang >Go-aufgeschobene Aufrufe: Werden Argumente sofort oder bei Funktionsausführung ausgewertet?

Go-aufgeschobene Aufrufe: Werden Argumente sofort oder bei Funktionsausführung ausgewertet?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-06 00:44:11571Durchsuche

Go Deferred Calls: Are Arguments Evaluated Immediately or Upon Function Execution?

Argumente des verzögerten Aufrufs: Sofortige Auswertung vs. Funktionsausführung

In Go können Sie mit einem verzögerten Funktionsaufruf Code ausführen, nachdem die umgebende Funktion zurückgegeben wurde. Das Verhalten verzögerter Anrufe kann jedoch verwirrend sein, wenn Sie nicht verstehen, wie mit Argumenten umgegangen wird.

Bewertung vs. Ausführung

Das Zitat aus „A Tour of Go“ besagt, dass „die Die Argumente des verzögerten Aufrufs werden sofort ausgewertet, der Funktionsaufruf wird jedoch erst ausgeführt, wenn die umgebende Funktion zurückkehrt. Das bedeutet:

  • Auswertung: Wenn Sie einen Funktionsaufruf zurückstellen, werden der Funktionswert und seine Parameter ausgewertet und erfasst. Dies geschieht, wenn die einschließende Funktion aufgerufen wird.
  • Ausführung: Nachdem die einschließende Funktion zurückgegeben wurde, wird die verzögerte Funktion ausgeführt.

Beispielerklärung

Sehen wir uns das bereitgestellte Beispiel an:

func def(s string) func() {
    fmt.Println("tier up")
    fmt.Println(s)
    return func() { fmt.Println("clean up") }
}

func main() {
    defer def("defered line")()
    fmt.Println("main")
}

Wann main() aufgerufen wird, geschieht Folgendes:

  1. Die Defer-Anweisung wertet das Argument zu def aus, das die konstante Zeichenfolge „defered line“ ist.
  2. Die Defer-Funktion wird mit aufgerufen „defered line“, gibt „tier ​​up“ und „defered line“ aus.
  3. Der Rückgabewert von def ist eine Funktion, die „clean up“ ausgibt. Diese Funktion wurde noch nicht ausgeführt.
  4. main() gibt „main“ aus.
  5. Sobald main() zurückkehrt, wird die verzögerte Funktion ausgeführt und gibt „clean up“ aus.

Fazit

Das Verständnis des Unterschieds zwischen Argumentauswertung und Funktionsausführung ist entscheidend für die effektive Nutzung verzögerter Aufrufe in Go. Argumente werden sofort ausgewertet, wenn die Defer-Anweisung ausgeführt wird, während der Funktionskörper erst ausgeführt wird, wenn die umschließende Funktion zurückkehrt. Dadurch können Sie die Reihenfolge steuern, in der Aktionen ausgeführt werden, und potenzielle Probleme im Zusammenhang mit unerwartetem Funktionsverhalten vermeiden.

Das obige ist der detaillierte Inhalt vonGo-aufgeschobene Aufrufe: Werden Argumente sofort oder bei Funktionsausführung ausgewertet?. 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