golang教程之switch語句
switch語句
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
將手指的值與每個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")
}
}
預設情況
我們手中只有5個手指。 如果輸入錯誤的手指號碼會發生什麼。 這是預設情況下的情況。 當沒有其他情況匹配時,將執行預設情況。
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")
}
}
在上面的程式中,手指是8並且它與任何情況都不匹配,因此列印了不正確的手指號碼。 預設值不一定是switch語句中的最後一種情況。 它可以出現在任何位置。
您可能還注意到手指宣告中的一個小變化。 它在交換機本身中宣告。 開關可以包括在評估表示式之前執行的可選語句。 在這行switch finger:= 8;
首先宣告手指並在表示式中使用。 在這種情況下,手指的範圍僅限於switch
塊。
多個表示式
通過用逗號分隔它們,可以在一個案例中包含多個表示式。
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")
}
}
上面的程式檢查字母是否是母音。“a”,“e”,“i”,“o”,“u”:`匹配所有母音。 該程式輸出母音。
無表示式的switch
表示式中的表示式是可選的,可以省略。 如果省略表示式,則認為switch
為真,並且每個case表示式都被評估為真,並且執行相應的程式碼塊。
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")
}
}
在上述程式中,表示式在開關中不存在,因此它被認為是真實的並且評估了每種情況。 case num> = 51 && num <= 100:
為true且程式輸出num大於51且小於100.這種型別的開關可以被視為多個if else
子句的替代。
Fallthrough
在Go中,控制元件在執行case
後立即從switch
語句中出來。 fallthrough
語句用於將控制轉移到在已執行的case
之後立即出現的case
的第一個語句。
讓我們寫一個程式來了解fallthrough
。 我們的程式將檢查輸入數字是否小於50,100或200.例如,如果我們輸入75,程式將列印75小於100和200.我們將使用fallthrough
實現此輸出。
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 num <100:
為true且程式列印75小於100.下一個語句是fallthrough
。 當遇到fallthrough
時,控制元件移動到下一個case的第一個語句,並且列印75小於200.程式的輸出是
75 is lesser than 100
75 is lesser than 200
fallthrough
應該是case中的最後一個語句。 如果它出現在中間的某個位置,編譯器將丟擲錯誤的fallthrough
語句