En golang, nous utilisons l'instruction defer pour effectuer certains travaux de gestion des erreurs et de finition. Sa fonction est similaire au mot-clé enfin en Java. Cependant, qu'il s'agisse du mot-clé enfin de Java ou de la classe Raii de C++, nous pouvons clairement connaître leur portée et leur timing d'exécution. Alors, quand le contenu traité par le mot-clé defer dans Golang est-il exécuté ?
Tout d'abord, la documentation officielle dit : Defer sera exécuté lorsque la fonction revient, que la fonction se termine ou que la goroutine correspondante panique.
Ce qu'il faut noter, c'est que, comme Golang prend en charge les retours à valeurs multiples, la valeur de retour est poussée sur la pile avant d'être renvoyée, tandis que le langage C stocke la valeur de retour dans un registre et la renvoie.
Lorsque Golang revient, il pousse d'abord la valeur de retour sur la pile ; puis exécute la fonction defer si la valeur de retour dans la pile est modifiée dans la fonction defer (mais cela ne doit pas être fait). , alors la valeur de retour sera modifiée ; puis revenez en arrière.
De cette façon, nous connaîtrons le moment de l'exécution defer Même si vous écrivez defer bien avant le retour, il sera toujours exécuté avant le retour de la fonction.
S'il y a plusieurs defers dans une portée, l'ordre d'exécution avant le retour consiste à exécuter d'abord le defer appelé plus tard, puis à exécuter le defer appelé plus tôt.
Il existe plusieurs exemples dans les documents officiels qui peuvent bien illustrer le timing du report, comme suit :
lock(l) defer unlock(l) // unlocking happens before surrounding function returns // prints 3 2 1 0 before surrounding function returns for i := 0; i <= 3; i++ { defer fmt.Print(i) } // f returns 1 func f() (result int) { defer func() { result++ }() return 0 }
Articles et tutoriels connexes recommandés : tutoriel golang
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!