În Go, instrucțiunile defer întârzie execuția unei funcții sau metode sau a unei metode anonime până când funcțiile din apropiere revin. Cu alte cuvinte, argumentele pentru amânarea funcțiilor sau metodelor sunt evaluate imediat, dar nu se execută până când funcțiile din apropiere revin. Puteți crea o metodă amânată, o funcție sau o funcție anonimă folosind cuvântul cheie defer.

Sintaxă:
// 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
}()
Notă importantă:
- În limbajul Go, mai multe instrucțiuni defer sunt permise în același program și sunt executate în ordinea LIFO (Last-In, First-Out), așa cum se arată în Exemplul 2.
- În instrucțiunile defer, argumentele sunt evaluate atunci când instrucțiunea defer este executată, nu atunci când este apelată.
- Declarațiile Defer sunt adesea folosite pentru a se asigura că fișierele sunt închise atunci când nevoia lor se termină, sau pentru a închide canalele sau pentru a detecta probleme în program.
Acum să ne uităm la un exemplu pentru a înțelege mai bine.
Exemplul 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()
}
Rezultat:
Result: 1035
Hello!, Quantrimang.com
Result: 1288
Explicație: În exemplul de mai sus, avem două funcții numite mul() și show() . În timp ce funcția show() este apelată în mod normal în funcția main() , funcția mul() este apelată în două moduri diferite:
- În primul rând, apelăm funcția mul în mod normal (fără cuvântul cheie defer), adică mul(23, 45) și se execută atunci când funcția este apelată (Ieșire: Rezultat: 1035).
- În al doilea rând, numim funcția mul() ca o funcție defer folosind cuvântul cheie defer, adică defer mul(23, 56) și se execută (Ieșire: Rezultat: 1288) când toate metodele din jur revin.
Exemplul 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)
}
Rezultat:
Start
Result: 20
Result: 90
End