- 原文地址:Part 10: Switch Statement
- 原文作者:Naveen R
- 譯者:咔嘰咔嘰 轉載請註明出處。
switch
是一個條件語句,它計算表示式並將其和可能的結果進行匹配,根據匹配執行程式碼塊。它常用來替代多個 if else 子句。
光說不練假把式,讓我們從一個簡單的例子開始,該例子將手指號作為輸入並輸出該手指的名稱:)。例如 1 是拇指,2 是無名指,依此類推。
package main
import (
"fmt"
)
func main() {
finger := 4
switch finger {
case 1:
fmt.Println("Thumb")
case 2:
fmt.Println("Index")
case 3:
fmt.Println("Middle")
case 4:
fmt.Println("Ring")
case 5:
fmt.Println("Pinky")
}
}
複製程式碼
在上述程式中,switch finger
將finger
的值與每個 case 語句進行比較。該語句從上到下進行比較,並執行與表示式匹配的第一個case
。在這個例子中,finger
的值為 4,因此列印Ring
。
具有相同值的case
是不被允許的。如果你試圖執行下面的程式,編譯器會報錯main.go:18:2: duplicate case 4 in switch previous case at tmp/sandbox887814166/main.go:16:7
package main
import (
"fmt"
)
func main() {
finger := 4
switch finger {
case 1:
fmt.Println("Thumb")
case 2:
fmt.Println("Index")
case 3:
fmt.Println("Middle")
case 4:
fmt.Println("Ring")
case 4://duplicate case
fmt.Println("Another Ring")
case 5:
fmt.Println("Pinky")
}
}
複製程式碼
預設的 case
我們手中只有 5 個手指。輸入錯誤的手指號會發生什麼?這是 預設的 case
的用武之地。當其他case
都不匹配時,將執行預設case
。
package main
import (
"fmt"
)
func main() {
switch finger := 8; finger {
case 1:
fmt.Println("Thumb")
case 2:
fmt.Println("Index")
case 3:
fmt.Println("Middle")
case 4:
fmt.Println("Ring")
case 5:
fmt.Println("Pinky")
default: //default case
fmt.Println("incorrect finger number")
}
}
複製程式碼
在上面的程式中,finger
的值是 8 並且它與任何case
都不匹配,因此列印incorrect finger number
。預設case
不一定是 switch 語句中的最後一個。它可以出現在switch
的任何位置。
你可能注意到宣告finger
的一個小變化,它在switch
中宣告。switch
可以包含一個可選的語句,它在表示式計算之前執行。在該行,switch finger := 8; finger
,首先宣告瞭finger
並在表示式中使用,而finger
的範圍僅限於switch
程式碼塊。
case 可以擁有多個表示式
可以在一個case
中用逗號分隔實現多個表示式。
package main
import (
"fmt"
)
func main() {
letter := "i"
switch letter {
case "a", "e", "i", "o", "u": //multiple expressions in case
fmt.Println("vowel")
default:
fmt.Println("not a vowel")
}
}
複製程式碼
上面的程式檢查字母是否是母音。case "a", "e", "i", "o", "u":
匹配所有母音。由於letter
的值為i
該程式輸出vowel
表示式 switch
switch
中的表示式是可選的,可以省略。如果省略表示式,則switch true
,每個case
表示式都視為true
,並且執行相應的程式碼塊。
package main
import (
"fmt"
)
func main() {
num := 75
switch { // expression is omitted
case num >= 0 && num <= 50:
fmt.Println("num is greater than 0 and less than 50")
case num >= 51 && num <= 100:
fmt.Println("num is greater than 51 and less than 100")
case num >= 101:
fmt.Println("num is greater than 100")
}
}
複製程式碼
在上述程式中,switch
沒有表示式,所以它被認為是true
,並且會執行每一個case
。case num >= 51 && num <= 100:
為true
且程式輸出num is greater than 51 and less than 100
。這種型別的switch
可以用來替代多個if else
的情況。
fallthrough
在 Go 語言中,在執行case
後立即從switch
語句中返回。 fallthrough
語句用於執行該case
之後,再執行下一個case
語句。
package main
import (
"fmt"
)
func number() int {
num := 15 * 5
return num
}
func main() {
switch num := number(); { //num is not a constant
case num < 50:
fmt.Printf("%d is lesser than 50\n", num)
fallthrough
case num < 100:
fmt.Printf("%d is lesser than 100\n", num)
fallthrough
case num < 200:
fmt.Printf("%d is lesser than 200", num)
}
}
複製程式碼
switch
和case
表示式不一定只能是常量。它們也可以在執行時進行賦值。在上面的程式中,num
被初始化為函式number()
的返回值。然後進入case
語句的計算,case num < 100:
為true
則程式列印75 is lesser than 100
,下一個語句是fallthrough
。當遇到fallthrough
時,將會執行下一個case
的語句,並且列印75 is lesser than 200
,程式的輸出是
75 is lesser than 100
75 is lesser than 200
複製程式碼
fallthrough
應該位於case
語句中的最後。如果它出現在中間的某個位置,編譯器會丟擲錯誤fallthrough statement out of place