Utilisation de defer dans le langage go : 1. L'instruction defer est exécutée avant le retour de la fonction ou après l'instruction return dans la fonction ; 2. L'ordre d'exécution de plusieurs instructions defer est dans l'ordre inverse ; defer après l'instruction de panique L'instruction n'est pas exécutée.
L'environnement d'exploitation de cet article : système Windows10, GO 1.11.2, ordinateur Thinkpad T480.
(Partage de vidéos d'apprentissage : Vidéo de programmation )
Introduction à l'utilisation :
defer est une instruction d'exécution retardée dans le langage Go, utilisée pour ajouter le fin d'une fonction Code exécuté lors de l'exécution, souvent utilisé pour libérer certaines ressources allouées, fermer les connexions à la base de données, déconnecter les connexions socket et déverrouiller une ressource verrouillée. Le mécanisme du langage Go garantit que le code de l'instruction defer sera exécuté.
Il existe des mécanismes similaires dans d'autres langages, tels que l'instructionfinal en Java et C#, et le destructeur en C++ qui peuvent jouer un rôle similaire. Le mécanisme du langage C++ garantit que l'objet doit être détruit avant de l'être. détruit. Le code dans le destructeur sera exécuté. Le destructeur en C++ détruit l'objet et le defer en Go détruit la fonction.
1. Calendrier d'exécution de l'instruction defer
L'instruction defer est exécutée avant le retour de la fonction ou après l'instruction return dans la fonction (l'instruction return peut appeler une autre fonction). Exemple de code :
package main import ( "fmt" ) func main() { fmt.Println(deferReturn()) } func deferReturn() (ret int) { defer func() { ret++ }() return 10 }
La valeur imprimée par le code ci-dessus est : 11. L'instruction defer "ret++" dans la fonction anonyme ajoute 1 à la valeur de retour 10 pour devenir 11. Regardons le code où une instruction defer apparaît après l'instruction return :
func returnDefer() (ret int) { return 0 defer func() { ret++ ret++ }() return 1 }
La valeur de retour de la fonction returnDefer ci-dessus est : 0. La raison en est que l'instruction defer est renvoyée avant d'ajouter du code et d'exécuter la fonction "return 0", donc l'instruction defer n'est pas exécutée.
2. L'ordre d'exécution de plusieurs instructions defer est l'ordre inverse
Lorsque plusieurs instructions defer apparaissent, elles sont exécutées dans l'ordre inverse (semblable à une pile, c'est-à-dire dernier entré, premier sorti ). Exemple de code :
func deferSample() { for i := 0; i < 5; i++ { defer fmt.Printf("%d ", i) } }
Le code ci-dessus affichera : 4 3 2 1 0
3. Différer et panique
1. exécuté
Exemple de code :
func panicDefer() { panic("panic") defer fmt.Println("defer after panic") }
La sortie du code ci-dessus est la suivante :
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
Vous pouvez voir que l'instruction defer n'est pas exécutée.
2. L'instruction defer avant l'instruction de panique sera exécutée
Exemple de code :
func deferPanic() { defer fmt.Println("defer before panic") panic("panic") }
La sortie du code ci-dessus est la suivante :
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
différer le contenu de la sortie de l'instruction.
Panic in Go est similaire au lancement d'exceptions dans d'autres langages. Le code après la panique ne sera plus exécuté (l'instruction defer avant l'instruction de panique sera exécutée).
4. La logique d'implémentation du retour
1. La première étape consiste à attribuer la valeur de retour (si la valeur de retour nommée est affectée directement, la valeur de retour anonyme est d'abord déclarée puis attribuée );
2. Dans la deuxième étape, appelez l'instruction de retour RET et transmettez la valeur de retour. RET vérifiera s'il existe une instruction defer si elle existe, elle insérera l'instruction defer dans l'ordre inverse ; > 3. Enfin, RET quittera la fonction avec la valeur de retour.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!