Chuyển đến nội dung chính
Mô-đun 2 · Bài học 4 trong tổng số 59/50 trong khóa học~10 min
Bài học theo mô-đun (4/5)

Công tắc thành ngữ

switch của Go tiện dụng hơn C/Java: mỗi case đều có khối ẩn riêng (không có break để viết), bạn có thể nhóm nhiều giá trị có dấu phẩy và switch không có biểu thức sẽ hoạt động giống như chuỗi if/else if dễ đọc hơn.

Bật một giá trị

Go
giorno := "mar"
switch giorno {
case "lun", "mar", "mer", "gio", "ven":
    fmt.Println("feriale")
case "sab", "dom":
    fmt.Println("weekend")
default:
    fmt.Println("sconosciuto")
}

case chấp nhận nhiều giá trị được phân tách bằng dấu phẩy và không có giá trị ngầm định nào dự phòng: ngay khi một trường hợp được thực thi, switch sẽ thoát.

Chuyển đổi không có điều kiện

Nếu bạn bỏ qua biểu thức, switch sẽ đánh giá true và mỗi case là một bool tình trạng. Đây là sự thay thế thành ngữ cho chuỗi if/else if dài:

Go
switch {
case x < 0:
    fmt.Println("negativo")
case x == 0:
    fmt.Println("zero")
case x < 10:
    fmt.Println("piccolo")
default:
    fmt.Println("grande")
}

Câu lệnh khởi tạo

Giống như if, switch cũng chấp nhận câu lệnh init:

Go
switch n := len(s); {
case n == 0:
    fmt.Println("vuoto")
case n > 100:
    fmt.Println("lungo")
default:
    fmt.Println("ok")
}

n chỉ tồn tại bên trong switch.

Rõ ràng fallthrough

Nếu bạn thực sự muốn việc thực thi rơi vào trường hợp tiếp theo, bạn phải viết nó:

Go
switch 1 {
case 1:
    fmt.Println("uno")
    fallthrough
case 2:
    fmt.Println("due")  // anche questo viene stampato
case 3:
    fmt.Println("tre")  // questo no
}

Chuyển đổi loại (xem trước)

Nó cho phép bạn phân biệt dựa trên loại động của giao diện giá trị. Chúng tôi sẽ đề cập sâu hơn về mô-đun Giao diện:

Go
var i interface{} = "ciao"
switch v := i.(type) {
case int:
    fmt.Println("int:", v)
case string:
    fmt.Println("string:", v)
default:
    fmt.Printf("tipo %T\n", v)
}

Hãy thử nó

tập thể dục#go.m2.l4.e1
Nỗ lực: 0Đang tải…

In 'feriale' cho lun/mar/mer/gio/ven, ngược lại là 'weekend', sử dụng nút chuyển trên giá trị của g.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Nhóm 5 ngày trong tuần thành một trường hợp duy nhất được phân tách bằng dấu phẩy.

Giải pháp khả dụng sau 3 lần thử

tập thể dục#go.m2.l4.e2
Nỗ lực: 0Đang tải…

Sử dụng một công tắc KHÔNG CÓ điều kiện để in 'neg', 'zero' hoặc 'pos' tùy thuộc vào x.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Không có biểu thức nào sau `switch`, chỉ có `{`.

Giải pháp khả dụng sau 3 lần thử

Quiz#go.m2.l4.e3
Sẵn sàng

Chương trình này in gì?

Go
switch 1 {
case 1:
    fmt.Print("a")
case 2:
    fmt.Print("b")
}
Tùy chọn trả lời

Tóm tắt lại

  • case chấp nhận nhiều giá trị được phân tách bằng dấu phẩy.
  • Không có dự phòng ngầm: mỗi trường hợp đều có break tiềm ẩn riêng.
  • switch { ... } không có biểu thức = chuỗi if/else if dễ đọc hơn.
  • Câu lệnh ban đầu: switch x := f(); { ... }, phạm vi giới hạn trong khối.
  • fallthrough tồn tại nhưng hiếm; đi vào trường hợp tiếp theo mà KHÔNG đánh giá tình trạng của nó.
  • Chuyển đổi loại v := i.(type) để phân biệt dựa trên loại động (mô-đun Giao diện).