Từ khóa Defer trong Golang

Trong ngôn ngữ Go, các câu lệnh defer trì hoãn việc thực thi hàm hoặc phương thức hay một phương thức ẩn danh cho đến khi các hàm gần đó trả về. Nói cách khác, những đối số gọi hàm hoặc phương thức defer được đánh giá ngay lập tức, nhưng chúng không thực thi cho đến khi các hàm gần đó trả về. Bạn có thể tạo một phương thức, hàm bị trì hoãn hay hàm ẩn danh bằng cách sử dụng từ khóa defer.

Defer trong Golang

Cú pháp:

// 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
}()

Lưu ý quan trọng:

  • Trong ngôn ngữ Go, nhiều câu lệnh defer được phép dùng trong cùng một chương trình và chúng được thực thi theo thứ tự LIFO (Last-In, First-Out) như thể hiện trong Ví dụ 2.
  • Trong các câu lệnh defer, các đối số được đánh giá khi câu lệnh defer được thực thi, không phải khi nó được gọi.
  • Các câu lệnh defer thường được sử dụng để đảm bảo rằng tệp được đóng khi nhu cầu của chúng kết thúc, hoặc để đóng kênh, hoặc để bắt các sự cố trong chương trình.

Giờ hãy cùng nhau xem xét ví dụ để hiểu rõ hơn.

Ví dụ 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()
}

Kết quả:

Result:  1035
Hello!, Quantrimang.com
Result:  1288

Giải thích: Trong ví dụ trên, chúng ta có hai hàm mang tên là mul()show(). Trong khi hàm show() được gọi bình thường trong hàm main(), hàm mul() được gọi theo hai cách khác nhau:

  • Đầu tiên, chúng ta gọi hàm mul bình thường (không có từ khóa defer), tức là mul(23, 45) và nó thực thi khi hàm được gọi (Đầu ra: Kết quả: 1035).
  • Thứ hai, chúng ta gọi hàm mul() như một hàm defer bằng cách sử dụng từ khóa defer, tức là defer mul(23, 56) và nó thực thi (Đầu ra: Kết quả: 1288) khi tất cả các phương thức xung quanh trả về.

Ví dụ 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)
}

Kết quả:

Start
Result:  20
Result:  90
End
Thứ Ba, 08/04/2025 11:48
51 👨 78
Xác thực tài khoản!

Theo Nghị định 147/2024/ND-CP, bạn cần xác thực tài khoản trước khi sử dụng tính năng này. Chúng tôi sẽ gửi mã xác thực qua SMS hoặc Zalo tới số điện thoại mà bạn nhập dưới đây:

Số điện thoại chưa đúng định dạng!
Số điện thoại này đã được xác thực!
Bạn có thể dùng Sđt này đăng nhập tại đây!
Lỗi gửi SMS, liên hệ Admin
0 Bình luận
Sắp xếp theo
❖
    Chia sẻ
    Chia sẻ FacebookChia sẻ Twitter
    Đóng