W języku Go polecenia defer opóźniają wykonanie funkcji, metody lub metody anonimowej do momentu, aż pobliskie funkcje zwrócą wynik. Innymi słowy, argumenty funkcji lub metod odroczonych są oceniane natychmiast, ale nie są wykonywane, dopóki pobliskie funkcje nie zwrócą wyników. Za pomocą słowa kluczowego defer można utworzyć metodę, funkcję lub funkcję anonimową odroczoną.

Składnia:
// 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
}()
Ważna uwaga:
- W języku Go w jednym programie dozwolone jest wiele poleceń defer. Są one wykonywane w kolejności LIFO (Last-In, First-Out), jak pokazano w przykładzie 2.
- W poleceniach defer argumenty są oceniane w momencie wykonania polecenia defer, a nie w momencie jego wywołania.
- Polecenia defer są często używane w celu zapewnienia zamknięcia plików, gdy nie jest to potrzebne, do zamknięcia kanałów lub wykrycia problemów w programie.
Teraz przyjrzyjmy się przykładowi, aby lepiej to zrozumieć.
Przykład 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()
}
Wynik:
Result: 1035
Hello!, Quantrimang.com
Result: 1288
Wyjaśnienie: W powyższym przykładzie mamy dwie funkcje o nazwach mul() i show() . Podczas gdy funkcja show() jest normalnie wywoływana w funkcji main() , funkcja mul() jest wywoływana na dwa różne sposoby:
- Najpierw wywołujemy funkcję mul normalnie (bez słowa kluczowego defer), tj. mul(23, 45), a ona wykonuje się w momencie wywołania funkcji (Wyjście: Wynik: 1035).
- Po drugie, wywołujemy funkcję mul() jako funkcję defer przy użyciu słowa kluczowego defer, tj. defer mul(23, 56), a ona wykonuje się (Wyjście: Wynik: 1288), gdy wszystkie otaczające metody zwrócą wartość.
Przykład 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)
}
Wynik:
Start
Result: 20
Result: 90
End