Từ khoá defer trong Go
TIL
595
Go
50
golang
49
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

109 bài viết.
1595 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
155 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 3 năm trước
155 46
White
149 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 2 năm trước
149 39
White
104 17
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 2 năm trước
104 17
Bài viết liên quan
White
0 2
fCC: Technical Documentation Page note So I have finished the HTML part of this exercise and I want to come here to lament about the lengthy HTML ...
HungHayHo viết 1 tháng trước
0 2
{{like_count}}

kipalog

{{ comment_count }}

bình luận

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


White
{{userFollowed ? 'Following' : 'Follow'}}
109 bài viết.
1595 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á!