Go 系列教程 —— 10. switch 語句

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。這是 [Golang 系列教程](/subject/2)中的第 10 篇。switch 是一個條件陳述式,用於將運算式的值與可能匹配的選項列表進行比較,並根據匹配情況執行相應的代碼塊。它可以被認為是替代多個 `if else` 子句的常用方式。看代碼比文字更容易理解。讓我們從一個簡單的例子開始,它將把一個手指的編號作為輸入,然後輸出該手指對應的名字。比如 0 是拇指,1 是食指等等。```gopackage mainimport ( "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") }}```[線上運行程式](https://play.golang.org/p/q4kjm2kpVe)在上述程式中,`switch finger` 將 `finger` 的值與每個 `case` 語句進行比較。通過從上到下對每一個值進行對比,並執行與選項值匹配的第一個邏輯。在上述範例中, `finger` 值為 4,因此列印的結果是 `Ring` 。在選項列表中,`case` 不允許出現重複項。如果您嘗試運行下面的程式,編譯器會報這樣的錯誤: `main.go:18:2:在tmp / sandbox887814166 / main.go:16:7````gopackage mainimport ( "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") }}```[線上運行程式](https://play.golang.org/p/SfXdChWdoN)## 預設情況(Default Case)我們每個人一隻手只有 5 個手指。如果我們輸入了不正確的手指編號會發生什嗎?這個時候就應該是屬於預設情況。當其他情況都不匹配時,將運行預設情況。```gopackage mainimport ( "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") }}```[線上運行程式](https://play.golang.org/p/Fq7U7SkHe1) 在上述程式中 `finger` 的值是 8,它不符合其中任何情況,因此會列印 `incorrect finger number`。default 不一定只能出現在 switch 語句的最後,它可以放在 switch 語句的任何地方。您可能也注意到我們稍微改變了 `finger` 變數的聲明方式。`finger` 聲明在了 switch 語句內。在運算式求值之前,switch 可以選擇先執行一個語句。在這行 `switch finger:= 8; finger` 中, 先聲明了`finger` 變數,隨即在運算式中使用了它。在這裡,`finger` 變數的範圍僅限於這個 switch 內。## 多運算式判斷通過用逗號分隔,可以在一個 case 中包含多個運算式。```gopackage mainimport ( "fmt")func main() { letter := "i" switch letter { case "a", "e", "i", "o", "u": // 一個選項多個運算式 fmt.Println("vowel") default: fmt.Println("not a vowel") }}```[線上運行程式](https://play.golang.org/p/Zs9Ek5SInh) 在 `case "a","e","i","o","u":` 這一行中,列舉了所有的母音。只要匹配該項,則將輸出 `vowel`。## 無運算式的 switch在 switch 語句中,運算式是可選的,可以被省略。如果省略運算式,則表示這個 switch 語句等同於 `switch true`,並且每個 `case` 運算式都被認定為有效,相應的代碼塊也會被執行。```gopackage mainimport ( "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") }}``` [線上運行程式](https://play.golang.org/p/mMJ8EryKbN) 在上述代碼中,switch 中缺少運算式,因此預設它為 true,true 值會和每一個 case 的求值結果進行匹配。`case num >= 51 && <= 100:` 為 true,所以程式輸出 `num is greater than 51 and less than 100`。這種類型的 switch 語句可以替代多個 `if else` 子句。## Fallthrough 語句在 Go 中,每執行完一個 case 後,會從 switch 語句中跳出來,不再做後續 case 的判斷和執行。使用 `fallthrough` 語句可以在已經執行完成的 case 之後,把控制權轉移到下一個 case 的執行代碼中。讓我們寫一個程式來理解 fallthrough。我們的程式將檢查輸入的數字是否小於 50、100 或 200。例如我們輸入 75,程式將輸出`75 is lesser than 100` 和 `75 is lesser than 200`。我們用 fallthrough 來實現了這個功能。```gopackage mainimport ( "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) }}```[線上運行程式](https://play.golang.org/p/svGJAiswQj)switch 和 case 的運算式不一定是常量。它們也可以在運行過程中通過計算得到。在上面的程式中,num 被初始化為函數 `number()` 的傳回值。程式運行到 switch 中時,會計算出 case 的值。`case num < 100:` 的結果為 true,所以程式輸出 `75 is lesser than 100`。當執行到下一句 `fallthrough` 時,程式控制直接跳轉到下一個 case 的第一個執行邏輯中,所以列印出 `75 is lesser than 200`。最後這個程式的輸出會是```75 is lesser than 100 75 is lesser than 200 ```**`fallthrough` 語句應該是 case 子句的最後一個語句。如果它出現在了 case 語句的中間,編譯器將會報錯:`fallthrough statement out of place`**這也是我們本教程的最後內容。還有一種 switch 類型稱為 **type switch** 。我們會在學習介面的時候再研究這個。希望您能享受本次閱讀。請留下您寶貴的意見和建議。**上一教程 - [迴圈](https://studygolang.com/articles/11924)****下一教程 - [Arrays 和 Slices](https://studygolang.com/articles/12121)**

via: https://golangbot.com/switch/

作者:Nick Coghlan 譯者:vicever 校對:Noluye

本文由 GCTT 原創編譯,Go語言中文網 榮譽推出

本文由 GCTT 原創翻譯,Go語言中文網 首發。也想加入譯者行列,為開源做一些自己的貢獻嗎?歡迎加入 GCTT!
翻譯工作和譯文發表僅用於學習和交流目的,翻譯工作遵照 CC-BY-NC-SA 協議規定,如果我們的工作有侵犯到您的權益,請及時聯絡我們。
歡迎遵照 CC-BY-NC-SA 協議規定 轉載,敬請在本文中標註並保留原文/譯文連結和作者/譯者等資訊。
文章僅代表作者的知識和看法,如有不同觀點,請樓下排隊吐槽

2627 次點擊  
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.