Go開(kāi)發(fā)工程師
未來(lái)3-5年企業(yè)高性能項(xiàng)目不可替代的語(yǔ)言,從基礎(chǔ)到項(xiàng)目實(shí)戰(zhàn)再到重構(gòu),真正從入門到精通
與串聯(lián)的if
語(yǔ)句類似,switch
語(yǔ)句提供了一個(gè)多分支條件執(zhí)行的方法。不過(guò)在這里用一個(gè)專有名詞來(lái)代表分支——case
。每一個(gè)case
可以攜帶一個(gè)表達(dá)式或一個(gè)類型說(shuō)明符。前者又可被簡(jiǎn)稱為case
表達(dá)式。因此,Go語(yǔ)言的switch
語(yǔ)句又分為表達(dá)式switch
語(yǔ)句和類型switch
語(yǔ)句。
先說(shuō)表達(dá)式switch
語(yǔ)句。在此類switch
語(yǔ)句中,每個(gè)case
會(huì)攜帶一個(gè)表達(dá)式。與if
語(yǔ)句中的條件表達(dá)式不同,這里的case
表達(dá)式的結(jié)果類型并不一定是bool
。不過(guò),它們的結(jié)果類型需要與switch
表達(dá)式的結(jié)果類型一致。所謂switch
表達(dá)式是指switch
語(yǔ)句中要被判定的那個(gè)表達(dá)式。switch
語(yǔ)句會(huì)依據(jù)該表達(dá)式的結(jié)果與各個(gè)case
表達(dá)式的結(jié)果是否相同來(lái)決定執(zhí)行哪個(gè)分支。請(qǐng)看下面的示例:
var name string // 省略若干條語(yǔ)句 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
語(yǔ)句中,name
充當(dāng)了switch
表達(dá)式,而"Go"
和"Rust"
充當(dāng)了case
表達(dá)式。它們的結(jié)果類型是一致的,都是string
。順便說(shuō)一句,可以有只包含一個(gè)字面量或標(biāo)識(shí)符的表達(dá)式。它們是最簡(jiǎn)單的表達(dá)式,屬于基本表達(dá)式的一種。
請(qǐng)大家注意switch
語(yǔ)句的寫(xiě)法。switch
表達(dá)式必須緊隨switch
關(guān)鍵字出現(xiàn)。在后面的花括號(hào)中,一個(gè)關(guān)鍵字case
、case
表達(dá)式、冒號(hào)以及后跟的若干條語(yǔ)句組成為一條case
語(yǔ)句。在switch
語(yǔ)句中可以有若干條case
語(yǔ)句。Go語(yǔ)言會(huì)依照從上至下的順序?qū)γ恳粭lcase
語(yǔ)句中case
表達(dá)式進(jìn)行求值。只要被發(fā)現(xiàn)其表達(dá)式與switch
表達(dá)式的結(jié)果相同,該case
語(yǔ)句就會(huì)被選中。它包含的那些語(yǔ)句就會(huì)被執(zhí)行。而其余的case
語(yǔ)句則會(huì)被忽略。
switch
語(yǔ)句中還可以存在一個(gè)特殊的case
——default case
。顧名思義,當(dāng)沒(méi)有一個(gè)常規(guī)的case
被選中的時(shí)候,default
case
就會(huì)被選中。上面示例中就存在一個(gè)default case
。它由關(guān)鍵字default
、冒號(hào)和后跟的一條語(yǔ)句組成。實(shí)際上,default case
不一定被追加在最后。它可以是第一個(gè)case
,或者出現(xiàn)在任意順位上。
另外,與if
語(yǔ)句一樣,switch
語(yǔ)句還可以包含初始化子句,且其出現(xiàn)位置和寫(xiě)法也如出一轍。如:
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!") }
好了,我們已經(jīng)對(duì)switch
語(yǔ)句的一般形式——表達(dá)式switch
語(yǔ)句——有所了解了。下面我們來(lái)說(shuō)說(shuō)類型switch
語(yǔ)句。它與一般形式有兩點(diǎn)差別。第一點(diǎn),緊隨case
關(guān)鍵字的不是表達(dá)式,而是類型說(shuō)明符。類型說(shuō)明符由若干個(gè)類型字面量組成,且多個(gè)類型字面量之間由英文逗號(hào)分隔。第二點(diǎn),它的switch
表達(dá)式是非常特殊的。這種特殊的表達(dá)式也起到了類型斷言的作用,但其表現(xiàn)形式很特殊,如:v.(type)
,其中v
必須代表一個(gè)接口類型的值。注意,該類表達(dá)式只能出現(xiàn)在類型switch
語(yǔ)句中,且只能充當(dāng)switch
表達(dá)式。一個(gè)類型switch
語(yǔ)句的示例如下:
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!") }
請(qǐng)注意,我們?cè)谶@里把switch
表達(dá)式的結(jié)果賦給了一個(gè)變量。如此一來(lái),我們就可以在該switch
語(yǔ)句中使用這個(gè)結(jié)果了。這段代碼被執(zhí)行后,標(biāo)準(zhǔn)輸出上會(huì)打印出A signed integer: 11. The type is int.
。
最后,我們來(lái)說(shuō)一下fallthrough
。它既是一個(gè)關(guān)鍵字,又可以代表一條語(yǔ)句。fallthrough
語(yǔ)句可被包含在表達(dá)式switch
語(yǔ)句中的case
語(yǔ)句中。它的作用是使控制權(quán)流轉(zhuǎn)到下一個(gè)case
。不過(guò)要注意,fallthrough
語(yǔ)句僅能作為case
語(yǔ)句中的最后一條語(yǔ)句出現(xiàn)。并且,包含它的case
語(yǔ)句不能是其所屬switch
語(yǔ)句的最后一條case
語(yǔ)句。
請(qǐng)把命令源碼文件index.go的第 10、11 行的“?”都替換為相應(yīng)的表達(dá)式,以保證該文件每次被運(yùn)行后都會(huì)在標(biāo)準(zhǔn)輸出上打印出Case A
。注意,第11行的“?”只能被替換成一個(gè)字面量。提示一下,表達(dá)式rand.Intn(4)
結(jié)果會(huì)是一個(gè)范圍在[0,4)的隨機(jī)數(shù)。
第10的“?”可以被替換為%2
,第11行的“?”可以被替換為int32
或rune
。
請(qǐng)驗(yàn)證,完成請(qǐng)求
由于請(qǐng)求次數(shù)過(guò)多,請(qǐng)先驗(yàn)證,完成再次請(qǐng)求
打開(kāi)微信掃碼自動(dòng)綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書(shū)簽
舉報(bào)