Heim > Artikel > Backend-Entwicklung > Was ist die Verwendung von „defer“ in der Go-Sprache?
Verwendung von defer in der Go-Sprache: 1. Die defer-Anweisung wird vor der Rückgabe der Funktion oder nach der return-Anweisung in der Funktion ausgeführt. 2. Die Ausführungsreihenfolge mehrerer defer-Anweisungen ist umgekehrt. 3. Die defer-Anweisung wird nach der Panik ausgeführt Anweisung wird nicht ausgeführt.
Die Betriebsumgebung dieses Artikels: Windows 10-System, GO 1.11.2, Thinkpad T480-Computer.
(Lernvideo-Sharing: Programmiervideo)
Einführung in die Verwendung:
defer ist eine verzögerte Ausführungsanweisung in der Go-Sprache. Sie wird häufig verwendet, um Code hinzuzufügen, der am Ende der Funktion ausgeführt werden soll um bestimmte zugewiesene Ressourcen freizugeben und die Datenbankverbindung zu schließen, die Verbindung zum Socket zu trennen und eine gesperrte Ressource zu entsperren. Der Go-Sprachmechanismus garantiert, dass der Code in der Defer-Anweisung ausgeführt wird.
Es gibt ähnliche Mechanismen in anderen Sprachen, wie zum Beispiel die „final“-Anweisung in Java und C#, und der Destruktor (Destruktor) in der Sprache C++ kann eine ähnliche Rolle spielen. Der C++-Sprachmechanismus garantiert, dass die Zerstörung ausgeführt wird, bevor das Objekt zerstört wird .Code in der Funktion. Der Destruktor in C++ zerstört das Objekt und der Defer in Go zerstört die Funktion.
1. Ausführungszeitpunkt der Defer-Anweisung
Die Defer-Anweisung wird ausgeführt, bevor die Funktion zurückkehrt oder nach der Return-Anweisung in der Funktion (die Return-Anweisung ruft möglicherweise eine andere Funktion auf). Beispielcode:
package main import ( "fmt" ) func main() { fmt.Println(deferReturn()) } func deferReturn() (ret int) { defer func() { ret++ }() return 10 }
Der vom obigen Code gedruckte Wert ist: 11. Die Defer-Anweisung „ret++“ in der anonymen Funktion addiert 1 zum Rückgabewert 10 und ergibt 11. Schauen wir uns den Code an, in dem nach der Return-Anweisung eine Defer-Anweisung erscheint:
func returnDefer() (ret int) { return 0 defer func() { ret++ ret++ }() return 1 }
Der Rückgabewert der obigen returnDefer-Funktion ist: 0. Der Grund dafür ist, dass die Defer-Anweisung zurückkehrt, bevor Code hinzugefügt und die Funktion „return 0“ ausgeführt wird, sodass die Defer-Anweisung nicht ausgeführt wird.
2. Die Ausführungsreihenfolge mehrerer Defer-Anweisungen ist umgekehrt.
Wenn mehrere Defer-Anweisungen angezeigt werden, werden sie in umgekehrter Reihenfolge ausgeführt (ähnlich einem Stapel, d. h. der letzte rein, der zuerst raus). Beispielcode:
func deferSample() { for i := 0; i < 5; i++ { defer fmt.Printf("%d ", i) } }
Der obige Code gibt Folgendes aus: 4 3 2 1 0
3. defer und panic
1. Die defer-Anweisung nach der panic-Anweisung wird nicht ausgeführt
Beispielcode:
func panicDefer() { panic("panic") defer fmt.Println("defer after panic") }
Ausgabe des Obigen Code Wie folgt:
panic: panic goroutine 1 [running]: main.panicDefer() E:/godemo/testdefer.go:17 +0x39 main.main() E:/godemo/testdefer.go:13 +0x20 Process finished with exit code 2
Sie können sehen, dass die Defer-Anweisung nicht ausgeführt wird.
2. Die Defer-Anweisung vor der Panic-Anweisung wird ausgeführt
Beispielcode:
func deferPanic() { defer fmt.Println("defer before panic") panic("panic") }
Die Ausgabe des obigen Codes lautet wie folgt:
defer before panic panic: panic goroutine 1 [running]: main.deferPanic() E:/godemo/testdefer.go:19 +0x95 main.main() E:/godemo/testdefer.go:14 +0x20 Process finished with exit code 2
Die Defer-Anweisung gibt den Inhalt aus.
Panic in Go ähnelt dem Auslösen von Ausnahmen in anderen Sprachen. Der Code nach Panic wird nicht mehr ausgeführt (die Defer-Anweisung wird vor der Panic-Anweisung ausgeführt).
4. Die Implementierungslogik der Rückgabe
1 Der erste Schritt besteht darin, dem Rückgabewert einen Wert zuzuweisen (wenn der benannte Rückgabewert zuerst deklariert und dann zugewiesen wird); Der zweite Schritt besteht darin, die RET-Rückgabeanweisung aufzurufen und als Rückgabewert zu übergeben. RET prüft, ob eine Defer-Anweisung vorhanden ist, und fügt die Defer-Anweisung in umgekehrter Reihenfolge ein.
3 mit dem Rückgabewert.
Golang-Tutorial
Das obige ist der detaillierte Inhalt vonWas ist die Verwendung von „defer“ in der Go-Sprache?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!