Đây là phần thứ 10 của series hướng dẫn này. Các bạn có thể xem hướng dẫn Phần 9: Vòng lặp ... ở đây.
Một switch là một câu lệnh điều kiện đánh giá một biểu thức và so sánh nó với một danh sách các kết quả phù hợp và thực thi các khối mã.
Cú pháp:
switch (expression)
{
case constant_1:
{
Statements;
break;
}
case constant_2:
{
Statements;
break;
}
.
.
.
case constant_n:
{
Statements;
break;
}
default:
{
Statements;
}
}
Chúng ta hãy bắt đầu với một ví dụ đơn giản, sẽ lấy một số ngón tay làm đầu vào và xuất ra tên của ngón tay đó.
Ví dụ:
package main
import (
"fmt"
)
func main() {
finger := 4
switch finger {
case 1:
fmt.Println("Ngón cái")
case 2:
fmt.Println("Ngón trỏ")
case 3:
fmt.Println("Ngón giữa")
case 4:
fmt.Println("Ngón áp út")
case 5:
fmt.Println("Ngón út")
}
}
Kết quả:
Ngón áp út
Trong chương trình trên, giá trị finger được so sánh với mỗi câu lệnh case. Các trường hợp được đánh giá từ trên xuống dưới và trường hợp đầu tiên khớp với biểu thức sẽ được thực hiện. Trong trường hợp này, finger có giá trị là 4 và vì vậy "Ngón áp út" được in.
Switch không cho phép các trường hợp trùng lặp có cùng giá trị. Ví dụ nếu như bạn chạy chương trình sau đây, trình biên dịch sẽ báo lỗi.
package main
import (
"fmt"
)
func main() {
finger := 4
switch finger {
case 1:
fmt.Println("Ngón cái")
case 2:
fmt.Println("Ngón trỏ")
case 3:
fmt.Println("Ngón giữa")
case 4:
fmt.Println("Ngón áp út")
case 4://duplicate case
fmt.Println("Ngón áp út khác")
case 5:
fmt.Println("Ngón út")
}
}
Output:
prog.go:18:2: duplicate case 4 in switch
previous case at prog.go:16:7
Default
Chúng ta có 5 ngón tay trên một bàn tay, điều gì sẽ xảy ra khi chúng ta truyền vào một số ngón tay không chính xác. Default sẽ được thực thi khi không có case nào đúng.
Ví dụ:
package main
import (
"fmt"
)
func main() {
switch finger := 8; finger {//finger được khai báo trong switch
case 1:
fmt.Println("Ngón cái")
case 2:
fmt.Println("Ngón trỏ")
case 3:
fmt.Println("Ngón giữa")
case 4:
fmt.Println("Ngón áp út")
case 5:
fmt.Println("Ngón út")
default: //default case
fmt.Println("Số ngón tay không chính xác")
}
}
Kết quả:
Số ngón tay không chính xác
Trong chương trình trên, finger được khai báo là 8, và nó không khớp với một case nào, nên câu lệnh trong default được thực thi. Trong trường hợp này bạn cũng có thể thấy finger được khai báo trực tiếp trong switch. Một switch có thể bao gồm một câu lệnh tuỳ chọn được thực hiện trước khi biểu thức được đánh giá.
Mutilple expressions in case
Trong switch có thể bao gồm nhiều biểu thức trong một case bằng việc tách chúng bởi dấu phẩy.
Ví dụ:
package main
import (
"fmt"
)
func main() {
letter := "i"
switch letter {
case "a", "e", "i", "o", "u": //multiple expressions in case
fmt.Println("Nguyên âm")
default:
fmt.Println("Không phải một nguyên âm")
}
}
Kết quả:
Nguyên âm
Chương trình trên kiểm tra xem letter có phải là một nguyên âm hay không và các trường hợp của nguyên âm được viết trong cùng một case và cách nhau bởi dấu phẩy.
Expressionless Switch
Biểu thức trong Switch là tuỳ chọn và nó có thể được bỏ qua. Nếu nó được bỏ qua thì switch được coi là đúng và mỗi biểu thức trong case được đánh giá và thực thi câu lệnh tương ứng.
Ví dụ:
package main
import (
"fmt"
)
func main() {
num := 75
switch {
case num >= 0 && num <= 50:
fmt.Println("num lớn hơn 0 và nhỏ hơn 50")
case num >= 51 && num <= 100:
fmt.Println("num lớn hơn 51 và nhỏ hơn 100")
case num >= 101:
fmt.Println("num lớn hơn 100")
}
}
Kết quả:
num lớn hơn 51 và nhỏ hơn 100
Trong chương trình trên, biểu thức không có trong switch và do đó nó được coi là đúng, mỗi biểu thức trong case đều được đánh giá. Loại này của switch có thể được coi là một thay thế cho nhiều mệnh đề if ... else.
Fallthrough
Trong Go, việc đi ra khỏi câu lệnh switch là ngay lập tức sau khi một case đúng được thực thi. Một lệnh fallthrough được sử dụng để chuyển quyền kiểm soát đến câu lệnh của case ngay sau nó. Điều này sẽ giúp tất cả các case đều được kiểm tra.
Ví dụ:
package main
import (
"fmt"
)
func number() int {
num := 15 * 5
return num
}
func main() {
switch num := number(); { //num không phải là một hằng số
case num < 50:
fmt.Printf("%d thì nhỏ hơn 50\n", num)
fallthrough
case num < 100:
fmt.Printf("%d thì nhỏ hơn 100\n", num)
fallthrough
case num < 200:
fmt.Printf("%d thì nhỏ hơn 200", num)
}
}
Kết quả:
75 thì nhỏ hơn 100
75 thì nhỏ hơn 200
Biểu thức switch và case không chỉ là hằng số. Trong chương trình trên, num được khởi tạo bằng giá trị trả về của hàm number().
Fallthrough phải là lệnh cuối cùng trong case, nếu đặt đâu đó ở giữa trình biên dịch sẽ báo lỗi.
Đây là phần cuối cùng trong bài hướng dẫn này. Có một loại khác của switch là type switch, điều này sẽ được tìm hiểu khi chúng ta nghiên cứu về interfaces.
Chúng ta vừa tìm hiểu xong Switch ... case. Hy vọng bạn sẽ thích và vui lòng để lại phản hồi ở phía dưới nhé!
Mời các bạn xem bài hướng dẫn tiếp theo: Phần 11 - Mảng and Slices
Bình luận