Go 語言 switch 的使用
一、基本介紹:
- switch 語句 基於不同條件執行不同動作,每一個 case 分支都是唯一的,從上到下執行,直到匹配爲止。
- 匹配項後面不需要加 break。
基本語法:
switch 表達式 {
case 表達式1,表達式2,…:
語句塊1
case 表達式3,表達式4:
語句塊2
default:
語句塊3
}
switch 大體流程:
- 先執行表達式,得到值,和 case 表達式進行比較,如果匹配到,就執行 case 的語句塊,然後退出 switch 控制;
- 若 switch 的表達式值,沒有和任何 case 的表達式匹配成功,執行 default 語句塊,然後退出 switch 控制;
- go 中 case 後的表達式可以有多個,使用 逗號隔開;
- go 中 case 語句塊不需要寫break,因爲默認會有;
簡單舉個栗子:
-
輸入一個字符,跟對應的字符進行匹配,輸出不同的結果:
package main import ( "fmt" ) func main(){ // 1.定義一個變量接收字符 // 2.使用switch 完成 var key byte fmt.Println("輸入a, b, c, d字符, 進行匹配") fmt.Scanf("%c", &key) switch key { case 'a': fmt.Println("輸入的是a") case 'b': fmt.Println("輸入的是b") case 'c': fmt.Println("輸入的是c") case 'd': fmt.Println("輸入的是d") default: fmt.Println("輸入超出範圍") } }
二、使用細節、注意事項:
-
case/switch 後是一個表達式(即:常量值、變量、一個有返回值的函數等都可以):
// 寫一個簡單的函數 func test(char byte) byte{ return char } func main(){ var key byte fmt.Println("輸入a,b,c,d 對應獲取不同的結果") fmt.Scanf("%c", &key) // case/switch 後面可以是一個有返回值的函數 switch test(key) { case 'a': fmt.Println("輸入的是a") case 'b': fmt.Println("輸入的是b") case 'c': fmt.Println("輸入的是c") case 'd': fmt.Println("輸入的是d") default: fmt.Println("輸入超出範圍") } }
-
case 後 的表達式的值數據類型,必須和 switch 表達式數據類型一致:
func main(){ var i int32 var j int64 // switch 後面表達式 跟case後面表達式 數據類型不同 錯誤示範 switch i { case j: fmt.Println("ok") default: fmt.Println("輸出default裏面內容") } }
-
case 後面可以跟多個表達式,使用逗號隔開:
func main(){ var i int32 var j int32 var k int32 // case 後面可以跟多個表達式, 使用逗號隔開 switch i { case j, k, 10: fmt.Println("ok") default: fmt.Println("輸出default裏面內容") } }
-
case 後面的表達式,如果是常量值(字面值),要求不能重複:
func main(){ var n1 int32 = 5 var n2 int32 = 20 // 值 不能進行重複使用, 常量5已經使用 第二個case 則不能再次使用 switch n1 { case n2, 5: fmt.Println("ok1") case 5: fmt.Println("ok2") default: fmt.Println("輸出default裏面內容") } }
-
case 後面 不需要帶 break;
-
default 語句並不是必須的:
func main(){ var n1 int32 = 5 var n2 int32 = 20 // default 語句並不是必有的 switch n1 { case n2, 5: fmt.Println("ok1") } }
-
switch 後 可以不帶表達式,類似 if—else 分支來使用:
func main(){ var n1 int32 = 5 // switch 語句後, 不需要跟表達式 類似 if --- else 分支 switch { case n1 == 5: fmt.Println("ok1") case n1 == 10: fmt.Println("ok2") default: fmt.Println("default") } var age int64 = 18 switch { case age >= 18 && age < 60: fmt.Println("成人票") case age < 18 && age >= 15: fmt.Println("青年票") case age > 12 : fmt.Println("兒童票") default: fmt.Println("是什麼票呢?") } }
-
switch 後 也可以直接聲明、定義一個變量,分號結束,
不推薦使用
:func main(){ // switch 語句後,直接聲明、定義一個變量, 不推薦使用, 用分號結束 switch age:= 18;{ case age >= 18 && age < 60: fmt.Println("成人票") case age < 18 && age >= 15: fmt.Println("青年票") case age > 12 : fmt.Println("兒童票") default: fmt.Println("是什麼票呢?") } }
-
switch 穿透 fallthrough,如果在 case 語句後增加fallthrough,會繼續執行下一個 case,也叫switch 穿透:
func main(){ // switch fallthrough 的使用 var age int64 = 18 switch { case age >= 18 && age < 60: fmt.Println("成人票") fallthrough case age < 18 && age >= 15: fmt.Println("青年票") case age > 12 : fmt.Println("兒童票") default: fmt.Println("是什麼票呢?") } }
三、switch 和 if 使用場景:
- 如果判斷具體數值不多,符合 整數、浮點數、字符、字符串 幾種類型。建議使用switch語句,高效簡潔。
- 對區間判斷和結果爲bool類型判斷,使用if範圍更廣。