In Go, le istruzioni defer ritardano l'esecuzione di una funzione o di un metodo o di un metodo anonimo finché non vengono restituite le funzioni vicine. In altre parole, gli argomenti per rinviare funzioni o metodi vengono valutati immediatamente, ma non vengono eseguiti finché non ritornano le funzioni vicine. È possibile creare un metodo differito, una funzione o una funzione anonima utilizzando la parola chiave defer.

Sintassi:
// 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
}()
Nota importante:
- Nel linguaggio Go sono consentite più istruzioni defer nello stesso programma e vengono eseguite secondo l'ordine LIFO (Last-In, First-Out), come mostrato nell'esempio 2.
- Nelle istruzioni defer, gli argomenti vengono valutati quando l'istruzione defer viene eseguita, non quando viene chiamata.
- Le istruzioni defer vengono spesso utilizzate per garantire che i file vengano chiusi quando termina la loro necessità, per chiudere i canali o per individuare problemi nel programma.
Ora vediamo un esempio per capire meglio.
Esempio 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()
}
Risultato:
Result: 1035
Hello!, Quantrimang.com
Result: 1288
Spiegazione: Nell'esempio precedente, abbiamo due funzioni denominate mul() e show() . Mentre la funzione show() viene chiamata normalmente nella funzione main() , la funzione mul() viene chiamata in due modi diversi:
- Per prima cosa, chiamiamo la funzione mul normalmente (senza la parola chiave defer), ovvero mul(23, 45), che verrà eseguita quando verrà chiamata la funzione (Output: Risultato: 1035).
- In secondo luogo, chiamiamo la funzione mul() come funzione defer utilizzando la parola chiave defer, ovvero defer mul(23, 56) e viene eseguita (Output: Risultato: 1288) quando tutti i metodi circostanti ritornano.
Esempio 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)
}
Risultato:
Start
Result: 20
Result: 90
End