[譯] part 10: switch 語句

咔嘰咔嘰發表於2019-04-20

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")

    }
}
複製程式碼

Run in playground

在上述程式中,switch fingerfinger的值與每個 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")

    }
}
複製程式碼

Run in playground

預設的 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")
    }
}
複製程式碼

Run in playground

在上面的程式中,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")
    }
}
複製程式碼

Run in playground

上面的程式檢查字母是否是母音。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")
    }

}
複製程式碼

Run in playground

在上述程式中,switch沒有表示式,所以它被認為是true,並且會執行每一個casecase 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)
	}

}
複製程式碼

Run in playground

switchcase表示式不一定只能是常量。它們也可以在執行時進行賦值。在上面的程式中,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

相關文章