Go開發工程師
未來3-5年企業高性能項目不可替代的語言,從基礎到項目實戰再到重構,真正從入門到精通
與串聯的if
語句類似,switch
語句提供了一個多分支條件執行的方法。不過在這里用一個專有名詞來代表分支——case
。每一個case
可以攜帶一個表達式或一個類型說明符。前者又可被簡稱為case
表達式。因此,Go語言的switch
語句又分為表達式switch
語句和類型switch
語句。
先說表達式switch
語句。在此類switch
語句中,每個case
會攜帶一個表達式。與if
語句中的條件表達式不同,這里的case
表達式的結果類型并不一定是bool
。不過,它們的結果類型需要與switch
表達式的結果類型一致。所謂switch
表達式是指switch
語句中要被判定的那個表達式。switch
語句會依據該表達式的結果與各個case
表達式的結果是否相同來決定執行哪個分支。請看下面的示例:
var name string // 省略若干條語句 switch name { case "Golang": fmt.Println("A programming language from Google.") case "Rust": fmt.Println("A programming language from Mozilla.") default: fmt.Println("Unknown!") }
可以看到,在上述switch
語句中,name
充當了switch
表達式,而"Go"
和"Rust"
充當了case
表達式。它們的結果類型是一致的,都是string
。順便說一句,可以有只包含一個字面量或標識符的表達式。它們是最簡單的表達式,屬于基本表達式的一種。
請大家注意switch
語句的寫法。switch
表達式必須緊隨switch
關鍵字出現。在后面的花括號中,一個關鍵字case
、case
表達式、冒號以及后跟的若干條語句組成為一條case
語句。在switch
語句中可以有若干條case
語句。Go語言會依照從上至下的順序對每一條case
語句中case
表達式進行求值。只要被發現其表達式與switch
表達式的結果相同,該case
語句就會被選中。它包含的那些語句就會被執行。而其余的case
語句則會被忽略。
switch
語句中還可以存在一個特殊的case
——default case
。顧名思義,當沒有一個常規的case
被選中的時候,default
case
就會被選中。上面示例中就存在一個default case
。它由關鍵字default
、冒號和后跟的一條語句組成。實際上,default case
不一定被追加在最后。它可以是第一個case
,或者出現在任意順位上。
另外,與if
語句一樣,switch
語句還可以包含初始化子句,且其出現位置和寫法也如出一轍。如:
names := []string{"Golang", "Java", "Rust", "C"} switch name := names[0]; name { case "Golang": fmt.Println("A programming language from Google.") case "Rust": fmt.Println("A programming language from Mozilla.") default: fmt.Println("Unknown!") }
好了,我們已經對switch
語句的一般形式——表達式switch
語句——有所了解了。下面我們來說說類型switch
語句。它與一般形式有兩點差別。第一點,緊隨case
關鍵字的不是表達式,而是類型說明符。類型說明符由若干個類型字面量組成,且多個類型字面量之間由英文逗號分隔。第二點,它的switch
表達式是非常特殊的。這種特殊的表達式也起到了類型斷言的作用,但其表現形式很特殊,如:v.(type)
,其中v
必須代表一個接口類型的值。注意,該類表達式只能出現在類型switch
語句中,且只能充當switch
表達式。一個類型switch
語句的示例如下:
v := 11 switch i := interface{}(v).(type) { case int, int8, int16, int32, int64: fmt.Printf("A signed integer: %d. The type is %T. \n", i, i) case uint, uint8, uint16, uint32, uint64: fmt.Printf("A unsigned integer: %d. The type is %T. \n", i, i) default: fmt.Println("Unknown!") }
請注意,我們在這里把switch
表達式的結果賦給了一個變量。如此一來,我們就可以在該switch
語句中使用這個結果了。這段代碼被執行后,標準輸出上會打印出A signed integer: 11. The type is int.
。
最后,我們來說一下fallthrough
。它既是一個關鍵字,又可以代表一條語句。fallthrough
語句可被包含在表達式switch
語句中的case
語句中。它的作用是使控制權流轉到下一個case
。不過要注意,fallthrough
語句僅能作為case
語句中的最后一條語句出現。并且,包含它的case
語句不能是其所屬switch
語句的最后一條case
語句。
請把命令源碼文件index.go的第 10、11 行的“?”都替換為相應的表達式,以保證該文件每次被運行后都會在標準輸出上打印出Case A
。注意,第11行的“?”只能被替換成一個字面量。提示一下,表達式rand.Intn(4)
結果會是一個范圍在[0,4)的隨機數。
第10的“?”可以被替換為%2
,第11行的“?”可以被替換為int32
或rune
。
請驗證,完成請求
由于請求次數過多,請先驗證,完成再次請求
打開微信掃碼自動綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報