En Go, las declaraciones de diferimiento retrasan la ejecución de una función o método o un método anónimo hasta que las funciones cercanas regresen. En otras palabras, los argumentos para diferir funciones o métodos se evalúan inmediatamente, pero no se ejecutan hasta que las funciones cercanas regresan. Puede crear un método diferido, una función o una función anónima utilizando la palabra clave defer.

Sintaxis:
// 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:
- En el lenguaje Go, se permiten múltiples declaraciones defer en el mismo programa y se ejecutan en orden LIFO (último en entrar, primero en salir) como se muestra en el Ejemplo 2.
- En las declaraciones de diferimiento, los argumentos se evalúan cuando se ejecuta la declaración de diferimiento, no cuando se la llama.
- Las declaraciones de aplazamiento se utilizan a menudo para garantizar que los archivos se cierren cuando finaliza su necesidad, o para cerrar canales, o para detectar problemas en el programa.
Ahora veamos un ejemplo para entenderlo mejor.
Ejemplo 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
Explicación: En el ejemplo anterior, tenemos dos funciones llamadas mul() y show() . Mientras que la función show() se llama normalmente en la función main() , la función mul() se llama de dos maneras diferentes:
- Primero, llamamos a la función mul normalmente (sin la palabra clave defer), es decir, mul(23, 45) y se ejecuta cuando se llama a la función (Salida: Resultado: 1035).
- En segundo lugar, llamamos a la función mul() como una función defer usando la palabra clave defer, es decir, defer mul(23, 56) y se ejecuta (Salida: Resultado: 1288) cuando todos los métodos circundantes retornan.
Ejemplo 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