Em Go, as instruções defer atrasam a execução de uma função ou método ou de um método anônimo até que as funções próximas retornem. Em outras palavras, os argumentos para adiar funções ou métodos são avaliados imediatamente, mas não são executados até que as funções próximas retornem. Você pode criar um método adiado, uma função ou uma função anônima usando a palavra-chave defer.

Sintaxe:
// 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:
- Na linguagem Go, várias instruções defer são permitidas no mesmo programa e são executadas na ordem LIFO (Último a Entrar, Primeiro a Sair), conforme mostrado no Exemplo 2.
- Em instruções defer, os argumentos são avaliados quando a instrução defer é executada, não quando ela é chamada.
- As instruções de adiamento são frequentemente usadas para garantir que os arquivos sejam fechados quando sua necessidade terminar, ou para fechar canais, ou para detectar problemas no programa.
Agora vamos ver um exemplo para entender melhor.
Exemplo 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()
}
Resultado:
Result: 1035
Hello!, Quantrimang.com
Result: 1288
Explicação: No exemplo acima, temos duas funções chamadas mul() e show() . Enquanto a função show() é chamada normalmente na função main() , a função mul() é chamada de duas maneiras diferentes:
- Primeiro, chamamos a função mul normalmente (sem a palavra-chave defer), ou seja, mul(23, 45) e ela é executada quando a função é chamada (Saída: Resultado: 1035).
- Em segundo lugar, chamamos a função mul() como uma função defer usando a palavra-chave defer, ou seja, defer mul(23, 56) e ela executa (Saída: Resultado: 1288) quando todos os métodos circundantes retornam.
Exemplo 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)
}
Resultado:
Start
Result: 20
Result: 90
End