Bạn có chắc chắn muốn xóa bài viết này không ?
Bạn có chắc chắn muốn xóa bình luận này không ?
Từ khoá defer trong Go
defer là gì? Tại sao phải dùng defer?
Trong Golang có một lệnh khá hay đó là defer
, khi một câu lệnh được đặt sau từ khoá defer
, thì nó sẽ được thực thi khi hàm chứa nó kết thúc. Cho dù bạn viết nó ở bất kì đâu.
Sau đây là một vài ví dụ về cách sử dụng defer
:
Ví dụ 1: Cách hoạt động của defer
func Hello() {
defer fmt.Println("World")
fmt.Println("Hello")
}
func main() {
fmt.Println("Say")
Hello()
}
Output của đoạn code trên sẽ là:
Say
Hello
World
Tức là, khi gặp lệnh defer
thì chương trình sẽ bỏ qua, chưa thực thi nó, tiếp tục thực thi các câu lệnh đằng sau cho đến khi thoát khỏi "khối lệnh bao quanh nó", mà ở đây là hàm Hello()
thì câu lệnh trong defer
mới được thực hiện.
Ví dụ 2: Dùng defer để tự đóng kết nối đến database khi chương trình kết thúc
func main() {
db, err := leveldb.OpenFile("/db/data", nil)
defer db.Close()
// Do thing A
...
// Do thing B
...
}
Trong ví dụ trên, khi bạn vừa khởi tạo xong đối tượng db
để kết nối tới database, bạn có thể gọi lệnh defer db.Close()
để "nhắc" Golang răng bạn muốn chạy câu lệnh này khi hàm main()
kết thúc.
Ví dụ 3: Trường hợp nhiều lệnh defer
được gọi liên tiếp
Khi chúng ta gọi nhiều lần defer
, Golang sẽ xử lý bằng cơ chế stack, lệnh nào vào trước thì chạy sau (first in last out)
func main() {
fmt.Println("counting")
for i := 0; i < 10; i++ {
defer fmt.Println(i)
}
fmt.Println("done")
}
Output của đoạn code trên sẽ là:
counting
done
9
8
7
6
5
4
3
2
1
0
Xem thêm về defer
tại đây: https://blog.golang.org/defer-panic-and-recover
Huy Tran 30-05-2016





