與串聯的if
語句相似,switch
語句提供了一個多分支條件執行的方法。不過在這裏用一個專有名詞來表明分支——case
。每個case
能夠攜帶一個表達式或一個類型說明符。前者又可被簡稱爲case
表達式。所以,Go語言的switch
語句又分爲表達式switch
語句和類型switch
語句。
先說表達式switch
語句。在此類switch
語句中,每一個case
會攜帶一個表達式。與if
語句中的條件表達式不一樣,這裏的case
表達式的結果類型並不必定是bool
。不過,它們的結果類型須要與switch
表達式的結果類型一致。所謂switch
表達式是指switch
語句中要被斷定的那個表達式。switch
語句會依據該表達式的結果與各個case
表達式的結果是否相同來決定執行哪一個分支。請看下面的示例:ui
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
語句還能夠包含初始化子句,且其出現位置和寫法也一模一樣。如:spa
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
語句的示例以下:code
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
語句。接口