En Go, les instructions defer retardent l'exécution d'une fonction, d'une méthode ou d'une méthode anonyme jusqu'au retour des fonctions à proximité. En d'autres termes, les arguments pour différer les fonctions ou les méthodes sont évalués immédiatement, mais ils ne s'exécutent pas tant que les fonctions proches ne sont pas renvoyées. Vous pouvez créer une méthode, une fonction ou une fonction anonyme différée à l'aide du mot-clé defer.

Syntaxe:
// Hàm
defer func func_name(parameter_list Type)return_type{
// Code
}
// Phương thức
defer func (receiver Type) method_name(parameter_list){
// Code
}
defer func (parameter_list)(return_type){
// code
}()
Remarque importante :
- Dans le langage Go, plusieurs instructions de report sont autorisées dans le même programme et elles sont exécutées dans l'ordre LIFO (dernier entré, premier sorti) comme indiqué dans l'exemple 2.
- Dans les instructions defer, les arguments sont évalués lorsque l'instruction defer est exécutée, et non lorsqu'elle est appelée.
- Les instructions de report sont souvent utilisées pour garantir que les fichiers sont fermés lorsque leur besoin prend fin, ou pour fermer des canaux, ou pour détecter des problèmes dans le programme.
Voyons maintenant un exemple pour mieux comprendre.
Exemple 1 :
// Chương trình Go minh họa
// khái niệm của lệnh defer
package main
import "fmt"
// Các hàm
func mul(a1, a2 int) int {
res := a1 * a2
fmt.Println("Result: ", res)
return 0
}
func show() {
fmt.Println("Hello!, Quantrimang.com")
}
// Hàm chính
func main() {
// Gọi hàm mul()
// Tại đây hàm mul hoạt động
// như một hàm bình thường
mul(23, 45)
// Gọi hàm mul()
// Dùng từ khóa defer
// Hàm the mul()
// là hàm defer
defer mul(23, 56)
// Gọi hàm show()
show()
}
Résultat:
Result: 1035
Hello!, Quantrimang.com
Result: 1288
Explication : Dans l’exemple ci-dessus, nous avons deux fonctions nommées mul() et show() . Alors que la fonction show() est appelée normalement dans la fonction main() , la fonction mul() est appelée de deux manières différentes :
- Tout d'abord, nous appelons la fonction mul normalement (sans le mot-clé defer), c'est-à-dire mul(23, 45) et elle s'exécute lorsque la fonction est appelée (Sortie : Résultat : 1035).
- Deuxièmement, nous appelons la fonction mul() comme une fonction de report en utilisant le mot-clé defer, c'est-à-dire defer mul(23, 56) et elle s'exécute (Sortie : Résultat : 1288) lorsque toutes les méthodes environnantes reviennent.
Exemple 2 :
// Minh họa chương trình Go
// dùng nhiều lệnh defer, để minh họa chính sách LIFO
package main
import "fmt"
// Các hàm
func add(a1, a2 int) int {
res := a1 + a2
fmt.Println("Result: ", res)
return 0
}
// Hàm chính
func main() {
fmt.Println("Start")
// Nhiều lệnh defer
// Triển khai theo thứ tự LIFO
defer fmt.Println("End")
defer add(34, 56)
defer add(10, 10)
}
Résultat:
Start
Result: 20
Result: 90
End