Phần trước: Học Go cấp tốc Phần 1: Packages, variables và functions.
Phần tiếp theo chúng ta sẽ cùng tìm hiểu cách điều khiển luồng (flow control) trong Go.
Vòng lặp
Trong Go chỉ có 1 kiểu vòng lặp là sử dụng for. Cách dùng tương tự các ngôn ngữ khác nhưng phần khai báo biến, điều kiện lặp, … không cần đặt trong cặp ngoặc tròn:
|
|
Vòng lặp for khi chỉ có điều kiện lặp thì hoạt động giống while trong các ngôn ngữ khác:
|
|
Điều kiện
Lệnh điều kiện trong Go sử dụng if, else, switch, và cũng như vòng lặp for chúng ta không cần cặp ngoặc tròn.
Với câu lệnh if chúng ta có thể khai báo biến ngay trong câu lệnh điều kiện, và biến này sẽ chỉ hoạt động ở trong block của lệnh if hoặc else:
|
|
Lệnh switch tương tự các ngôn ngữ khác, tuy nhiên có một số điểm khác biệt:
Biểu thức trong switch không được sử dụng hằng số (constant). Không cần lệnh break trong mỗi case(mặc định các case tự break). Do đó chỉ có trường hợp thỏa mãn đầu tiên được chạy (tính từ trên xuống dưới). Ví dụ:
1 2 3 4 5 6 7 8
switch num := 10; { case num < 50: fmt.Printf("%d < 50\n", num) // In ra 10 < 50 case num < 100: fmt.Printf("%d < 100\n", num) // Lệnh này không chạy mặc dù cũng thỏa mãn điều kiện default: fmt.Printf("I don't know", num) }
Có thể sử dụng nhiều điều kiện trong một case,hoặc sử dụng từ khóa fallthrough để cho phép chạy tiếp xuống câu lệnh tiếp theo:
1 2 3 4 5 6 7 8 9 10 11
num := 10; switch { // Tương đương với switch true case num >= 0 && num <= 50: fmt.Printf("%d < 50 \n", num) // In ra 10 < 50 fallthrough case num < 100: fmt.Printf("%d < 100 \n", num) // In ra 10 < 100 default: fmt.Printf("I don't know", num) }
Trì hoãn
Trì hoãn (defer) là một khái niệm khá mới trong điều khiển luồng. Nó cho phép một câu lệnh được gọi ra nhưng không thực thi ngay mà hoãn lại đến khi các lệnh xung quanh trả về kết quả. Ví dụ:
|
|
Các lệnh được gọi qua từ khóa defer sẽ được đưa vào một stack, tức là hoạt động theo cơ chế vào sau ra trước (last-in-first-out). Lệnh nào defer sau sẽ được thực thi trước, giống như xếp 1 chồng đĩa thì chiếc đĩa sau cùng (ở trên cùng) sẽ được lấy ra trước. Ví dụ:
|
|
Chú ý là khi gọi lệnh defer thì giá trị của biến trong câu lệnh sẽ là giá trị tại thời điểm gọi chứ không phải giá trị tại thời điểm thực thi.
Tiếp theo: Phần 3: Arrays và Slices.