Golang - A Tour of Go (Các cấu trúc điều khiển)
Bài viết trước đã xem qua các phần cơ bản của Golang, và để tìm hiểu tiếp về Golang, nay ta tiếp tục dựa theo Tour Of Go để tìm hiểu các cấu trúc điều khiển
For
- Điểm đặc biệt của Golang là nó chỉ có 1 cú pháp loop là
Formà thôi
for i := 0; i < 10; i++ {
sum += i
}
- Khác với
ChayJavascript, cú phápforcủa Go không có cặp dấu()để bao lại và cặp dấu{}của block tính toán thì là bắt buộc - Giá trị khởi tạo của biến index và biểu thức cập nhập index cũng không yêu cầu bắt buộc
sum := 1
for ; sum < 1000; {
sum += sum
}
- Có thể viết lại bằng cách bỏ dấu
;đi, và giờ trông nó chẳng khác hàm nào hàmwhiletrongC
sum := 1
for sum < 1000 {
sum += sum
}
If
- Cũng như
for, mệnh đềifkhông yêu cầu cặp()và block phía trong thì yêu cầu{}
func sqrt(x float64) string {
if x < 0 {
return sqrt(-x) + "i"
}
return fmt.Sprint(math.Sqrt(x))
}
- Câu
ifcó thể gán thêm 1 biểu thức tính toán trước khi thực hiện điều kiện
func pow(x, n, lim float64) float64 {
if v := math.Pow(x, n); v < lim {
return v
}
return lim
}
Biến v cũng chỉ có scope ở trong block của if
Ifthì sẽ đi vớielsecho điều ngược lại
Switch
- Là 1 cách viết ngắn và dễ đọc hơn so với
if...else - Khác với
ChayJavascript, switch trongGosẽ chỉ chạy với case được chỉ định chứ không chạy tất cả các case, do đó không cần dùngbreakở cuối case block. - Điểm khác biệt nữa là case value cũng ko nhất thiết phải là constant hay integer
func main() {
fmt.Print("Go runs on ")
switch os := runtime.GOOS; os {
case "darwin":
fmt.Println("OS X.")
case "linux":
fmt.Println("Linux.")
default:
// freebsd, openbsd,
// plan9, windows...
fmt.Printf("%s.", os)
}
}
Defer
- Câu
deferđể làm chậm quá trình thực hiện tham số truyền vào cho đến khi hàm đang chứa câu lệnhdeferđược return.
func main() {
defer fmt.Println("world")
fmt.Println("hello")
}
//=> hello
//=> world
Stacking Defers
- Những
defercủa function sẽ được push vào stack. Và khi hàm chứa deferer được return, thì các deferred sẽ được đẩy ra thực hiện theo trình tự Last In First Out
func main() {
fmt.Println("counting")
for i := 0; i < 3; i++ {
defer fmt.Println(i)
}
fmt.Println("done")
}
//counting
//done
//2
//1
//0
Kết luận
- Câu điều kiện, vòng lặp của
Golangkhông có quá nhiều khác biệt với các ngôn ngữ khác, riêng Loop thì có phần đơn giản hơn do chỉ có đúng 1 cách thức thực hiện - Defer là 1 cái gì đó mới, hữu dụng khi ta muốn thực hiện 1 tính toán nào đấy khi hàm được trả về, thường được sử dụng để đơn giản hóa các chức năng thực hiện các hành động dọn dẹp tài nguyên.
Written on November 20, 2017