В Go операторы defer задерживают выполнение функции, метода или анонимного метода до тех пор, пока не вернутся близлежащие функции. Другими словами, аргументы для отложенных функций или методов оцениваются немедленно, но они не выполняются до тех пор, пока не вернутся близлежащие функции. Вы можете создать отложенный метод, функцию или анонимную функцию, используя ключевое слово defer.

Синтаксис:
// 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
}()
Важное примечание:
- В языке Go допускается использование нескольких операторов defer в одной программе, и они выполняются в порядке LIFO (Last-In, First-Out), как показано в примере 2.
- В операторах defer аргументы оцениваются при выполнении оператора defer, а не при его вызове.
- Операторы Defer часто используются для обеспечения закрытия файлов, когда в них отпадает необходимость, или для закрытия каналов, или для выявления проблем в программе.
Теперь давайте рассмотрим пример, чтобы лучше понять.
Пример 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()
}
Результат:
Result: 1035
Hello!, Quantrimang.com
Result: 1288
Пояснение: В приведенном выше примере у нас есть две функции с именами mul() и show() . В то время как функция show() обычно вызывается в функции main() , функция mul() вызывается двумя разными способами:
- Сначала мы вызываем функцию mul обычным образом (без ключевого слова defer), т. е. mul(23, 45), и она выполняется при вызове функции (Вывод: Результат: 1035).
- Во-вторых, мы вызываем функцию mul() как функцию defer, используя ключевое слово defer, т. е. defer mul(23, 56), и она выполняется (Вывод: Результат: 1288), когда все окружающие методы возвращаются.
Пример 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)
}
Результат:
Start
Result: 20
Result: 90
End