您好,登錄后才能下訂單哦!
switch 是一個條件語句,用于將表達式的值與可能匹配的選項列表進行比較,并根據(jù)匹配情況執(zhí)行相應的代碼塊。它可以被認為是替代多個 if else
子句的常用方式。
看代碼比文字更容易理解。讓我們從一個簡單的例子開始,它將把一個手指的編號作為輸入,然后輸出該手指對應的名字。比如 0 是拇指,1 是食指等等。
package main
import (
"fmt"
)
func main() {
finger := 4
switch finger {
case 1:
fmt.Println("Thumb")
case 2:
fmt.Println("Index")
case 3:
fmt.Println("Middle")
case 4:
fmt.Println("Ring")
case 5:
fmt.Println("Pinky")
}
}
在上述程序中,switch finger
將 finger
的值與每個 case
語句進行比較。通過從上到下對每一個值進行對比,并執(zhí)行與選項值匹配的第一個邏輯。在上述樣例中, finger
值為 4,因此打印的結(jié)果是 Ring
。
在選項列表中,case
不允許出現(xiàn)重復項。如果您嘗試運行下面的程序,編譯器會報這樣的錯誤: main.go:18:2:在tmp / sandbox887814166 / main.go:16:7
package main
import (
"fmt"
)
func main() {
finger := 4
switch finger {
case 1:
fmt.Println("Thumb")
case 2:
fmt.Println("Index")
case 3:
fmt.Println("Middle")
case 4:
fmt.Println("Ring")
case 4://重復項
fmt.Println("Another Ring")
case 5:
fmt.Println("Pinky")
}
}
我們每個人一只手只有 5 個手指。如果我們輸入了不正確的手指編號會發(fā)生什么?這個時候就應該是屬于默認情況。當其他情況都不匹配時,將運行默認情況。
package main
import (
"fmt"
)
func main() {
switch finger := 8; finger {
case 1:
fmt.Println("Thumb")
case 2:
fmt.Println("Index")
case 3:
fmt.Println("Middle")
case 4:
fmt.Println("Ring")
case 5:
fmt.Println("Pinky")
default: // 默認情況
fmt.Println("incorrect finger number")
}
}
在上述程序中 finger
的值是 8,它不符合其中任何情況,因此會打印 incorrect finger number
。default 不一定只能出現(xiàn)在 switch 語句的最后,它可以放在 switch 語句的任何地方。
您可能也注意到我們稍微改變了 finger
變量的聲明方式。finger
聲明在了 switch 語句內(nèi)。在表達式求值之前,switch 可以選擇先執(zhí)行一個語句。在這行 switch finger:= 8; finger
中, 先聲明了finger
變量,隨即在表達式中使用了它。在這里,finger
變量的作用域僅限于這個 switch 內(nèi)。
通過用逗號分隔,可以在一個 case 中包含多個表達式。
package main
import (
"fmt"
)
func main() {
letter := "i"
switch letter {
case "a", "e", "i", "o", "u": // 一個選項多個表達式
fmt.Println("vowel")
default:
fmt.Println("not a vowel")
}
}
在 case "a","e","i","o","u":
這一行中,列舉了所有的元音。只要匹配該項,則將輸出 vowel
。
在 switch 語句中,表達式是可選的,可以被省略。如果省略表達式,則表示這個 switch 語句等同于 switch true
,并且每個 case
表達式都被認定為有效,相應的代碼塊也會被執(zhí)行。
package main
import (
"fmt"
)
func main() {
num := 75
switch { // 表達式被省略了
case num >= 0 && num <= 50:
fmt.Println("num is greater than 0 and less than 50")
case num >= 51 && num <= 100:
fmt.Println("num is greater than 51 and less than 100")
case num >= 101:
fmt.Println("num is greater than 100")
}
}
在上述代碼中,switch 中缺少表達式,因此默認它為 true,true 值會和每一個 case 的求值結(jié)果進行匹配。case num >= 51 && <= 100:
為 true,所以程序輸出 num is greater than 51 and less than 100
。這種類型的 switch 語句可以替代多個 if else
子句。
在 Go 中,每執(zhí)行完一個 case 后,會從 switch 語句中跳出來,不再做后續(xù) case 的判斷和執(zhí)行。使用 fallthrough
語句可以在已經(jīng)執(zhí)行完成的 case 之后,把控制權轉(zhuǎn)移到下一個 case 的執(zhí)行代碼中。
讓我們寫一個程序來理解 fallthrough。我們的程序?qū)z查輸入的數(shù)字是否小于 50、100 或 200。例如我們輸入 75,程序?qū)⑤敵?code>75 is lesser than 100 和 75 is lesser than 200
。我們用 fallthrough 來實現(xiàn)了這個功能。
package main
import (
"fmt"
)
func number() int {
num := 15 * 5
return num
}
func main() {
switch num := number(); { // num is not a constant
case num < 50:
fmt.Printf("%d is lesser than 50\n", num)
fallthrough
case num < 100:
fmt.Printf("%d is lesser than 100\n", num)
fallthrough
case num < 200:
fmt.Printf("%d is lesser than 200", num)
}
}
switch 和 case 的表達式不一定是常量。它們也可以在運行過程中通過計算得到。在上面的程序中,num 被初始化為函數(shù) number()
的返回值。程序運行到 switch 中時,會計算出 case 的值。case num < 100:
的結(jié)果為 true,所以程序輸出 75 is lesser than 100
。當執(zhí)行到下一句 fallthrough
時,程序控制直接跳轉(zhuǎn)到下一個 case 的第一個執(zhí)行邏輯中,所以打印出 75 is lesser than 200
。最后這個程序的輸出會是
75 is lesser than 100
75 is lesser than 200
fallthrough 語句應該是 case 子句的最后一個語句。如果它出現(xiàn)在了 case 語句的中間,編譯器將會報錯:fallthrough statement out of place
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。