GO語言————5.3 switch 結構
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 函式,要求接受一個代表月份的數字,然後返回所代表月份所在季節的名稱(不用考慮月份的日期)。
相關文章
- GO語言————5.4 for 結構Go
- Go 語言 結構體Go結構體
- Go語言(1)——程式結構Go
- Go 語言 結構體連結串列Go結構體
- Go語言————7.3 For-range 結構Go
- go語言學習-結構體Go結構體
- Go 語言 結構體和方法Go結構體
- GO語言————5.1 控制結構之if-else結構Go
- Go快速入門 03 | 控制結構:if、for、switch 邏輯語句Go
- GO語言————4.2 Go程式的基本結構和要素Go
- 帶讀 |《Go in Action》(中文:Go語言實戰) 語法和語言結構概覽(三)Go
- 帶讀 |《Go in Action》(中文:Go語言實戰)語法和語言結構概覽 (二)Go
- Go 語言目錄結構與實踐Go
- GO語言基礎(結構+語法+型別+變數)Go型別變數
- Go語言流程控制之迴圈結構篇Go
- Go語言基礎語法總結Go
- Go語言學習筆記 - PART7 - 結構體Go筆記結構體
- SQL語言(結構化查詢語言)SQL
- GO語言學習筆記-包結構篇 Study for Go ! Chapter eight - Package StructureGo筆記APTPackageStruct
- Go語言————1、初識GO語言Go
- 包羅永珍的結構體 -- 就要學習 Go 語言結構體Go
- Go 語言—資料結構和演算法專案推薦Go資料結構演算法
- Go語言實現excel匯入無限級選單結構GoExcel
- C語言-選擇結構C語言
- GO語言————2、GO語言環境安裝Go
- C#快速入門教程(13)—— switch語句結構C#
- go語言之結構體和方法Go結構體
- Go語言入門系列(五)之指標和結構體的使用Go指標結構體
- Go語言結構體鏈式程式設計與JSON序列化Go結構體程式設計JSON
- Go語言結構體(struct)物件導向程式設計基礎篇Go結構體Struct物件程式設計
- Go語言實現的23種設計模式之結構型模式Go設計模式
- C語言教程——03 C語言結構C語言
- 【Go語言入門系列】(八)Go語言是不是面嚮物件語言?Go物件
- Go_go語言初探Go
- C語言結構體專題C語言結構體
- C語言結構體大小分析C語言結構體
- Go語言mapGo
- go 語言切片Go