GO語言————5.3 switch 結構

FLy_鵬程萬里發表於2018-06-29

5.3 switch 結構

相比較 C 和 Java 等其它語言而言,Go 語言中的 switch 結構使用上更加靈活。它接受任意形式的表示式:

switch var1 {
	case val1:
		...
	case val2:
		...
	default:
		...
}

變數 var1 可以是任何型別,而 val1 和 val2 則可以是同型別的任意值。型別不被侷限於常量或整數,但必須是相同的型別;或者最終結果為相同型別的表示式。前花括號 { 必須和 switch 關鍵字在同一行。

您可以同時測試多個可能符合條件的值,使用逗號分割它們,例如:case val1, val2, val3

每一個 case 分支都是唯一的,從上至下逐一測試,直到匹配為止。( Go 語言使用快速的查詢演算法來測試 switch 條件與 case 分支的匹配情況,直到演算法匹配到某個 case 或者進入 default 條件為止。)

一旦成功地匹配到某個分支,在執行完相應程式碼後就會退出整個 switch 程式碼塊,也就是說您不需要特別使用 break 語句來表示結束。

因此,程式也不會自動地去執行下一個分支的程式碼。如果在執行完每個分支的程式碼後,還希望繼續執行後續分支的程式碼,可以使用 fallthrough 關鍵字來達到目的。

因此:

switch i {
	case 0: // 空分支,只有當 i == 0 時才會進入分支
	case 1:
		f() // 當 i == 0 時函式不會被呼叫
}

並且:

switch i {
	case 0: fallthrough
	case 1:
		f() // 當 i == 0 時函式也會被呼叫
}

在 case ...: 語句之後,您不需要使用花括號將多行語句括起來,但您可以在分支中進行任意形式的編碼。當程式碼塊只有一行時,可以直接放置在 case 語句之後。

您同樣可以使用 return 語句來提前結束程式碼塊的執行。當您在 switch 語句塊中使用 return 語句,並且您的函式是有返回值的,您還需要在 switch 之後新增相應的 return 語句以確保函式始終會返回。

可選的 default 分支可以出現在任何順序,但最好將它放在最後。它的作用類似於 if-else 語句中的 else,表示不符合任何已給出條件時,執行相關語句。

示例 5.4 switch1.go

package main

import "fmt"

func main() {
	var num1 int = 100

	switch num1 {
	case 98, 99:
		fmt.Println("It's equal to 98")
	case 100: 
		fmt.Println("It's equal to 100")
	default:
		fmt.Println("It's not equal to 98 or 100")
	}
}

輸出:

It's equal to 100

在第 12.1 節,我們會使用 switch 語句判斷從鍵盤輸入的字元(詳見第 12.2 節的 switch.go)。switch 語句的第二種形式是不提供任何被判斷的值(實際上預設為判斷是否為 true),然後在每個 case 分支中進行測試不同的條件。當任一分支的測試結果為 true 時,該分支的程式碼會被執行。這看起來非常像鏈式的 if-else 語句,但是在測試條件非常多的情況下,提供了可讀性更好的書寫方式。

switch {
	case condition1:
		...
	case condition2:
		...
	default:
		...
}

例如:

switch {
	case i < 0:
		f1()
	case i == 0:
		f2()
	case i > 0:
		f3()
}

任何支援進行相等判斷的型別都可以作為測試表示式的條件,包括 int、string、指標等。

示例 5.4 switch2.go

package main

import "fmt"

func main() {
	var num1 int = 7

	switch {
	    case num1 < 0:
		    fmt.Println("Number is negative")
	    case num1 > 0 && num1 < 10:
		    fmt.Println("Number is between 0 and 10")
	    default:
		    fmt.Println("Number is 10 or greater")
	}
}

輸出:

Number is between 0 and 10

switch 語句的第三種形式是包含一個初始化語句:

switch initialization {
	case val1:
		...
	case val2:
		...
	default:
		...
}

這種形式可以非常優雅地進行條件判斷:

switch result := calculate(); {
	case result < 0:
		...
	case result > 0:
		...
	default:
		// 0
}

在下面這個程式碼片段中,變數 a 和 b 被平行初始化,然後作為判斷條件:

switch a, b := x[i], y[j]; {
	case a < b: t = -1
	case a == b: t = 0
	case a > b: t = 1
}

switch 語句還可以被用於 type-switch(詳見第 11.4 節)來判斷某個 interface 變數中實際儲存的變數型別。

問題 5.1:

請說出下面程式碼片段輸出的結果:

k := 6
switch k {
	case 4: fmt.Println("was <= 4"); fallthrough;
	case 5: fmt.Println("was <= 5"); fallthrough;
	case 6: fmt.Println("was <= 6"); fallthrough;
	case 7: fmt.Println("was <= 7"); fallthrough;
	case 8: fmt.Println("was <= 8"); fallthrough;
	default: fmt.Println("default case")
}

練習 5.2: season.go

寫一個 Season 函式,要求接受一個代表月份的數字,然後返回所代表月份所在季節的名稱(不用考慮月份的日期)。


相關文章