Từ khoá defer trong Go
TIL
781
Go
41
golang
40
White

Huy Trần viết ngày 03/06/2016

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

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Huy Trần

120 bài viết.
2067 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
186 46
Tại sao phải viết blog kĩ thuật? Có rất nhiều bài viết trên mạng nói về vấn đề tại sao một lập trình viên nên thường xuyên viết các bài blog kĩ thu...
Huy Trần viết gần 6 năm trước
186 46
White
157 39
(Ảnh) Tiếp tục sêri (Link) lần này, chúng ta sẽ cùng tìm hiểu và mô phỏng lại một chức năng mà mọi người đang bắt đầu sử dụng hằng ngày, đó là chứ...
Huy Trần viết gần 5 năm trước
157 39
White
121 19
Phần 1: Tự truyện Tui và Toán đã từng là hai kẻ thù không đội trời chung trong suốt hơn mười lăm năm ròng rã. Ngay từ ánh nhìn đầu tiên đã ghét nh...
Huy Trần viết 5 năm trước
121 19
Bài viết liên quan
White
12 2
Makefile thực hiện một số thao tác thường dùng trong Go Khi làm project Go mình thường tạo một file Makefile dạng này: Lưu ý nhớ thay thành tên m...
Huy Trần viết gần 5 năm trước
12 2
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
120 bài viết.
2067 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!