[Golang cơ bản] Switch trong golang

Post on: 2023-04-11 22:39:07 | in: Golang
Trong Golang, câu lệnh switch được sử dụng để kiểm tra một biến hoặc một giá trị và thực hiện một số lệnh tương ứng với các giá trị khác nhau của biến đó.

Tổng quan

Câu lệnh Switch là một cách hoàn hảo để ngăn chặn việc sử dụng chuỗi if-else. Đây là định dạng cho câu lệnh switch:

switch statement; expression {
case expression1:
     //Dosomething
case expression2:
     //Dosomething
default:
     //Dosomething
}

Đây là cách switch hoạt động. Cho một biểu thức switch, nó sẽ duyệt qua tất cả các trường hợp và cố gắng tìm trường hợp đầu tiên với biểu thức case phù hợp với biểu thức switch, nếu không có trường hợp nào phù hợp thì trường hợp mặc định sẽ được thực thi nếu có. Thứ tự của việc phù hợp là từ trên xuống dưới và sau đó từ trái sang phải (khi trường hợp chứa nhiều biểu thức như chúng ta sẽ thấy sau trong hướng dẫn này).

Những điểm quan trọng

Một số điều quan trọng cần biết về switch trước khi chúng ta đi đến ví dụ mã:

  • Cả switch statement và switch expression đều là các câu lệnh tùy chọn. Vì vậy, có tối đa bốn trường hợp có thể xảy ra với chúng:

Cả switch statement và switch expression đều có mặt

switch statement; expression {
   ...
}

Chỉ có switch statement, switch expression không có mặt

switch statement; {
    ...
}

Chỉ có switch expression, switch statement không có mặt

switch expression {
   ..
}

Cả switch statement và switch expression đều không có mặt.

switch {
  ...
}
  • Nếu không cung cấp switch expression, kiểu mặc định mà trình biên dịch sẽ giả định là boolean.
  • Kiểu của switch expression và tất cả các case expression phải khớp với nhau, nếu không sẽ có một lỗi biên dịch được tạo ra. Khi không cung cấp switch expression, kiểu của tất cả case expression cũng cần phải là kiểu boolean.
  • switch statement có thể là bất kỳ một lệnh nào có khai báo ngắn gọn, gọi hàm hoặc gán giá trị. Nếu switch statement có khai báo biến, phạm vi của biến đó bị giới hạn trong khối switch.
  • switch có thể có bất kỳ số lượng case nào.
  • Trường hợp mặc định là tùy chọn.
  • Một case có thể có nhiều biểu thức được phân tách bằng dấu phẩy. Lúc đó case sẽ trông như sau:
case expression1_1, expression_2 ...:
  • case block cũng cho phép từ khóa fallthrough, nó chuyển quyền điều khiển sang case tiếp theo, ngay cả khi case hiện tại không khớp.
  • break, một lệnh cần thiết trong các trường hợp của switch case trong nhiều ngôn ngữ khác, nhưng trong Go thì không cần thiết. Go tự động cung cấp lệnh break ở cuối mỗi khối case. Tuy nhiên, cũng đúng nếu sử dụng từ khóa break rõ ràng để kết thúc việc thực thi trong switch statement.
  • Hai trường hợp không thể có cùng một giá trị hằng số. Trong trường hợp đó, trình biên dịch sẽ tạo ra một lỗi biên dịch.
  • switch statement cũng có thể được sử dụng như một loại type switch, trong đó nó được sử dụng

Ví dụ

Hãy xem một số ví dụ đơn giản để minh họa các điểm trên.

Cả lệnh switch và biểu thức switch đều có thể tồn tại

package main

import "fmt"

func main() {
    switch ch := "b"; ch {
    case "a":
        fmt.Println("a")
    case "b", "c":
        fmt.Println("b or c")   
    default:
        fmt.Println("No matching character")   
    }

    //fmt.Println(ch)

Output:

b or c

Một số điểm cần lưu ý:

  • Trong ví dụ trên, chúng ta có một switch statement có một khai báo ngắn.
  • Sau đó, các case của switch khớp với biểu thức switch là "b" ở đây.
  • Ngoài ra, trong mỗi case có thể có nhiều biểu thức, như chúng ta thấy ở case thứ hai có hai biểu thức.
case "b", "c":
  • Biến ch chỉ có sẵn trong khối switch. Hãy bỏ chú thích dòng fmt.Println(ch) ở bên ngoài khối switch và nó sẽ gây ra lỗi.
undefined: ch

Cả switch statement và switch expression đều không có

Hãy xem một ví dụ khác nữa, trong đó chúng ta bỏ qua cả câu lệnh switch lẫn biểu thức switch:

package main

import "fmt"

func main() {
    age := 45
    switch {
    case age < 18:
        fmt.Println("Kid")
    case age >= 18 && age < 40:
        fmt.Println("Young")
    default:
        fmt.Println("Old")
    }
}

Output

Old

Điểm cần lưu ý về ví dụ trên:

  • Vì chúng ta đã bỏ qua biểu thức switch, loại mặc định của biểu thức switch là boolean. Mỗi biểu thức case cũng đánh giá thành boolean nên chương trình hoạt động tốt.
  • Trường hợp mặc định được thực thi trong ví dụ trên vì không có biểu thức case nào khớp.

Chỉ có câu lệnh switch

Chú ý đến ký tự ';' sau câu lệnh.

package main

import "fmt"

func main() {

    switch age := 29; {
    case age < 18:
        fmt.Println("Kid")
    case age >= 18 && age < 40:
        fmt.Println("Young")
    default:
        fmt.Println("Old")
    }
}

Output:

Young

Chỉ có Switch Expression

package main

import "fmt"

func main() {
    char := "a"
    switch char {
    case "a":
        fmt.Println("a")
    case "b":
        fmt.Println("b")
    default:
        fmt.Println("No matching character")
    }
}

Output

a

Trường hợp trùng lặp

Hai câu lệnh case không thể có hằng số giống nhau. Ví dụ như trong trường hợp dưới đây, sẽ có một lỗi biên dịch được ném ra vì "a" xuất hiện trong hai câu lệnh case:

duplicate case "a" in switch
 
package main

import "fmt"

func main() {
    switch "a" {
    case "a":
        fmt.Println("a")
    case "a":
        fmt.Println("Another a")
    case "b":
        fmt.Println("b")
    default:
        fmt.Println("No matching character")
    }
}

Từ khóa "fallthrough"

Xem mã dưới đây cho ví dụ về từ khóa fallthrough. Trong ví dụ dưới đây, ngay cả khi case thứ hai khớp, nó vẫn đi qua case thứ ba vì có từ khóa fallthrough:

package main

import "fmt"

func main() {
    i := 45
    switch {
    case i < 10:
        fmt.Println("i is less than 10")
        fallthrough
    case i < 50:
        fmt.Println("i is less than 50")
        fallthrough
    case i < 100:
        fmt.Println("i is less than 100")
    }
}

Output

i is less than 50
i is less than 100

Điều cần lưu ý với từ khóa fallthrough là nó phải được đặt ở cuối cùng của các câu lệnh trong khối switch. Nếu không, trình biên dịch sẽ báo lỗi.

fallthrough statement out of place

Chương trình dưới đây sẽ báo lỗi trên vì chúng ta có fmt.Println sau câu lệnh fallthrough

package main

import "fmt"
​​​​​​​
func main() {
    i := 45
    switch {
    case i < 10:
        fmt.Println("i is less than 10")
        fallthrough
    case i < 50:
        fmt.Println("i is less than 50")
        fallthrough
        fmt.Println("Not allowed")
    case i < 100:
        fmt.Println("i is less than 100")
    }
}

Câu lệnh Break

Dưới đây là ví dụ về câu lệnh break

package main

import "fmt"
​​​​​​​
func main() {
    switch char := "b"; char {
    case "a":
        fmt.Println("a")
    case "b":
        fmt.Println("b")
        break
        fmt.Println("after b")
    default:
        fmt.Println("No matching character")
    }
}

Output

b

câu lệnh break sẽ chấm dứt việc thực thi switch và các dòng bên dưới sẽ không được thực thi nữa

fmt.Println("after b")

Type Switch

Câu lệnh Switch cũng có thể được sử dụng để xác định kiểu của một giao diện (interface) tại thời điểm chạy như được thể hiện trong ví dụ dưới đây. Cấu trúc Type Switch so sánh các kiểu thay vì các giá trị.

package main

import "fmt"

func main() {
    printType("test_string")
    printType(2)
}

func printType(t interface{}) {
    switch v := t.(type) {
    case string:
        fmt.Println("Type: string")
    case int:
        fmt.Println("Type: int")
    default:
        fmt.Printf("Unknown Type %T", v)
    }
}

Output:

Type: string
Type: int

Tổng kết

Đó là tất cả những gì cần biết về câu lệnh Switch trong Go. Mong rằng bạn đã thích bài viết này. Vui lòng chia sẻ phản hồi/cải tiến/sai sót trong phần bình luận.

Tag: golang cơ bản go