Đâ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")

    }
}

Run in playground

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")

	}
}

Run in playground

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")
    }
}

Run in playground

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")
	}
}

Run in playground

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")
	}

}

Run in playground

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)
	}

}

Run in playground

Kết quả:

75 thì nhỏ hơn 100
75 thì nhỏ hơn 200

Biểu thức switchcase 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 switchtype 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 

Nguồn: https://golangbot.com/learn-golang-series/