1. 程式人生 > >golang教程之switch語句

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語句