[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 đó.
- [Golang cơ bản] Từ khóa defer trong Go
- [Golang cơ bản] Pointer trong golang
- [Golang cơ bản] Struct trong Golang
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áccase 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ấpswitch 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ếuswitch statement
có khai báo biến, phạm vi của biến đó bị giới hạn trong khốiswitch
.switch
có thể có bất kỳ số lượngcase
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óafallthrough
, nó chuyển quyền điều khiển sangcase
tiếp theo, ngay cả khicase
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ủaswitch 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ệnhbreak
ở cuối mỗi khốicase
. Tuy nhiên, cũng đúng nếu sử dụng từ khóabreak
rõ ràng để kết thúc việc thực thi trongswitch 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ạitype 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.