2. Điều khiển luồng với if, else, switch và defer

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:

// Tính tổng các số từ 0 - 9
sum := 0
for i := 0; i < 10; i++ {
    sum += i
}
fmt.Println(sum)

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:

sum := 0
for sum < 10 {
    sum += sum
}
fmt.Println(sum)

Đ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:

import (
    "fmt"
    "math"
)

func pow(x, n, limit float64) float64 {
    // Khai báo biến v trong lệnh điều kiện của if sẽ chỉ sử dụng được trong block if hoặc else
    if v := math.Pow(x, n); v < limit {
        return v
    } else {
        fmt.Printf("%g >= %g\n", v, limit)
    }

    // Không sử dụng được biến v ở bên ngoài, ví dụ return v sẽ báo lỗi
    return lim
}

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ụ:

  • 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:

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.

alt text

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.

Last updated

Was this helpful?