1. 程式人生 > >Golang教程:(十)switch 語句

Golang教程:(十)switch 語句

這是本Golang系列教程的第十篇。

switch 是一個條件語句,用於將一個表示式的求值結果與可能的值的列表進行匹配,並根據匹配結果執行相應的程式碼。可以認為 switch 語句是編寫多個 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") } }

在上面的程式中,case 語句依次(從上到下)求值並與 finger 進行匹配,直到找到第一個與 finger 匹配的 case,並執行其中的程式碼。在這裡 finger 的值為 4,因此列印 Ring

多個有相同值的 case 是不允許的。如果你執行下面的程式,編譯將會報錯:duplicate case 4 in switch

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://duplicate case
        fmt.Println("Another Ring"
) case 5: fmt.Println("Pinky") } }

default case

我們每隻手只有 5 根手指,但是如果我們輸入一個錯誤的手指序號會發生什麼呢?這裡就要用到 default 語句了。當沒有其他 case 匹配時,將執行 default 語句。

package main

import (  
    "fmt"
)

func main() {  
    switch finger := 8; finger {//finger is declared in switch
    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: //default case
        fmt.Println("incorrect finger number")
    }
}

在上面的程式中,finger 的值為 8,它不匹配任何 case,因此列印 incorrect finger numberdefault 語句不必放在 switch 語句的最後,而可以放在 switch 語句的任何位置。

你也許發現了另外一個小的改變,就是將 finger 宣告在了 switch 語句中。switch 語句可以包含一個可選的語句,該語句在表示式求值之前執行。在 switch finger := 8; finger 這一行中, finger 首先被宣告,然後作為表示式被求值。這種方式(譯者注:在 switch 語句中宣告變數的方式)宣告的 finger 只能在 switch 語句中訪問。

包含多個表示式的 case

可以在一個 case 中包含多個表示式,每個表示式用逗號分隔。

package main

import (  
    "fmt"
)

func main() {  
    letter := "i"
    switch letter {
    case "a", "e", "i", "o", "u": //multiple expressions in case
        fmt.Println("vowel")
    default:
        fmt.Println("not a vowel")
    }
}

上面的程式檢測 letter 是否是母音。case "a", "e", "i", "o", "u": 這一行匹配所有的母音。程式的輸出為:vowel

沒有表示式的 switch

switch 中的表示式是可選的,可以省略。如果省略表示式,則相當於 switch true,這種情況下會將每一個 case 的表示式的求值結果與 true 做比較,如果相等,則執行相應的程式碼。

package main

import (  
    "fmt"
)

func main() {  
    num := 75
    switch { // expression is omitted
    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 後面沒有表示式因此被認為是 switch true 並對每一個 case 表示式的求值結果與 true 做比較。case num >= 51 && num <= 100:的求值結果為 true,因此程式輸出:num is greater than 51 and less than 100。這種型別的 switch 語句可以替代多重 if else 子句。

fallthrough

在 Go 中執行完一個 case 之後會立即退出 switch 語句。fallthrough語句用於標明執行完當前 case 語句之後按順序執行下一個case 語句。

讓我們寫一個程式來了解 fallthrough。下面的程式檢測 number 是否小於 50,100 或 200。例如,如果我們輸入75,程式將列印 75 小於 100 和 200,這是通過 fallthrough 語句實現的。

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)
    }

}

switchcase 中的表示式不必是常量,他們也可以在執行時被求值。在上面的程式num 初始化為函式 number() 的返回值。程式首先對 switch 中的表示式求值,然後依次對每一個case 中的表示式求值並與 true 做匹配。匹配到 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 語句塊中的最後一條語句。如果它出現在語句塊的中間,編譯器將會報錯:fallthrough statement out of place

還有一種 switch 語句叫做 type switch,我們將在學習介面時介紹它。

switch 語句的介紹到此結束。感謝閱讀。

相關推薦

Golang教程switch 語句

這是本Golang系列教程的第十篇。 switch 是一個條件語句,用於將一個表示式的求值結果與可能的值的列表進行匹配,並根據匹配結果執行相應的程式碼。可以認為 switch 語句是編寫多個 if-else 子句的替代方式。 舉例是說明問題最好的方式,讓

Golang教程陣列和切片

這是本Golang系列教程的第十一篇。 陣列 陣列是型別相同的元素的集合。例如,整數 5, 8, 9, 79, 76 的集合就構成了一個數組。Go不允許在陣列中混合使用不同型別的元素(比如整數和字串)。 宣告 陣列的型別為 n[T],其中 n

Golang教程介紹和安裝

這是本Golang系列教程的第一篇。 什麼是Golang Golang 又稱為 Go,是由 Google 開發的一種開源的、編譯型的、靜態型別的程式語言。 Golang 的主要目的是使開發高可用性和高擴充套件性的Web應用程式變得簡單。 為什

Golang教程Hello World

這是本Golang系列教程的第二篇。請閱讀 Golang教程:(一)介紹和安裝 來了解什麼是Golang以及如何安裝它。 除了親自寫程式碼以外沒有更好的方式來學習一門新的程式語言。在這篇教程中我們將開始編寫我們的第一個程式。 我個人(原文作者)推薦使用

Golang教程協程

在上一篇教程中,我們討論了併發,以及併發和並行的區別。在這篇教程中我們將討論在Go中如何通過Go協程實現併發。 什麼是協程 Go協程(Goroutine)是與其他函式或方法同時執行的函式或方法。可以認為Go協程是輕量級的執行緒。與建立執行緒相比,建立

Golang學習筆記switch分支語句

Golang的switch可以不用在每個case裡寫一個break,Golang會自動加入。 default關鍵字可以帶,也可以不帶,不是必須要有的。 首先是一個最基礎的示例,在switch後面帶一個變數。 func ScoreGrade1() { gradel := "B" s

Golang教程二十三緩衝通道和工人池

什麼是緩衝通道上一節我們討論的是基本的無緩衝區的通道,對一個無緩衝的通道進行傳送/寫入和接收/讀取資料是實時阻塞的。事實上我們可以建立一個帶緩衝區的通道,往通道中傳送資料時,只有當緩衝區滿的情況下才會阻塞;類似的,只有我們從通道中讀取資料時,只有讀到緩衝區空為止才會阻塞。帶緩

Android 開發初識ExpandableListView(可擴充套件的下拉列表元件)

隨便扯點兒 前幾天做iOS仿QQ,其中好友列表頁面就有下拉列表的功能,iOS做法應該比安卓稍微複雜一點,其中佈局以及一些實現方法(協議方法)都類似,不一樣的應該是動畫切換效果,安卓提供現成的元件,用原生的就可以實現。 iOS示例 http://blog.

Golang學習筆記函式申明及變數作用域

標準函式格式:func 函式名 (引數列表) (返回值列表) func funcName (parametername1 type1,parametername2 type2...) (output1 type1,output2 type2...) 1、可以使用可變引數:func funcNam

【TeeChart for Java教程圖表面板上的自定義繪圖

TeeChart Canvas 1 繪圖線 1.1 2D圖表 新增一個繪圖線: private void Load() { line1.fillSampleValues(20); line1.setVertAxis(Vertic

微服務Springcloud超詳細教程+實戰

本人正在找深圳Java實習工作,求大佬帶飛 QQ:1172796094 如在文件中遇到什麼問題請聯絡作者 —————————————————————————————————————— 服務消費者 獲取服務列表 當服務消費者啟動時,會檢測eureka.client.f

資料預處理系列用因子分析降維

因子分析(factor analysis)是另一種降維方法。與PCA不同的是,因子分析有假設而PCA沒有假設。因子分析的基本假設是有一些隱藏特徵與資料集的特徵相關。 這個主題將濃縮(boil down)樣本資料集的顯性特徵,嘗試像理解因變數一樣地理解自變數之間的隱藏特徵。

GitHub入門教程1簡單的git使用,同步倉庫

使用   git add "READEME.md"   新增一個READEME.md檔案 使用  git status 檢視狀態,是否在倉庫中添加了一個檔案。 使用  git commit -m "新增一個檔案"     ps.引號內的是註釋 push成功,可

學習Spring Boot使用hibernate validation完成資料後端校驗

前言 後臺資料的校驗也是開發中比較注重的一點,用來校驗資料的正確性,以免一些非法的資料破壞系統,或者進入資料庫,造成資料汙染,由於資料檢驗可能應用到很多層面,所以系統對資料校驗要求比較嚴格且追求可變性及效率。 瞭解 瞭解一點概念性的東東。 * JSR 3

Objective-C學習筆記——迴圈語句for和do-while的使用

      在OC中,除了while這種迴圈方式外,還有另外for迴圈和do-while迴圈,它們在不同的業務邏輯下會有不同的作用。可以和C語言和Java對比著學習。(一)程式碼一:int main(int argc, const char * argv[]) { @

Spring Boot開發常用的熱部署方式彙總

前言平時開發Sprig Boot的時候,經常改動個小小的地方就要重新啟動專案,這無疑是一種很差的體驗。在此,博主收集了3種熱部署的方案供大家選擇。本文為轉載內容:Spring Boot乾貨系列:(十)開發常用的熱部署方式彙總正文目前博主用過的有三種:Spring Loaded

基於U3D的VR開發教程1基礎環境配置

開發環境搭建 需要準備的開發工具 U3D,推薦5.0以上 vs推薦2012以上,2012開發需要外掛,2015已經整合。 SteamvrPlugin 推薦外掛VRTK HTC VIVE ps:如果電腦硬體效能過低,可以去下載steamvr的測試版,測

【TeeChart Pro ActiveX教程縮放和滾動

下載TeeChart Pro ActiveX最新版本 如何使用滑鼠進行縮放和滾動 縮放 要放大圖表,請在要放大的區域的左上角按住滑鼠左鍵並按住滑鼠按鈕,將矩形拖動到縮放區域的右下角。釋放滑鼠按鈕,圖表將重繪所選區域。 要撤消縮放,請在“Chart”區域的任意位置按滑鼠左鍵,然後按住滑鼠按鈕向上和向左

【TeeChart Pro ActiveX教程列印圖表

下載TeeChart Pro ActiveX最新版本 標準列印 TeeChart Pro提供標準列印方法,可將“螢幕圖表”按原樣列印到印表機。 簡單列印命令 要列印圖表,請使用Print方法。這將打印出螢幕上顯示的圖表: [C#] tChart1.Printer.Print(); [VB.N

jmeter教程流程控制初識

在程式設計中,流程分為三種:順序流程、分支流程、迴圈流程。順序流程,即自頂而下,逐句執行的流程。分支流程,即兩個或多個分支,每次只走一個分支的流程。迴圈流程,即一段程式碼,重複地執行。我們前面所講的,全都是順序流程,現在講一下分支流程和迴圈流程。流程這塊,本是放到後面,等電子商城後臺系統寫好一些邏輯