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 number
。default
語句不必放在 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)
}
}
switch
與 case
中的表示式不必是常量,他們也可以在執行時被求值。在上面的程式中 num
初始化為函式 number()
的返回值。程式首先對 switc
h 中的表示式求值,然後依次對每一個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教程(十):流程控制初識
在程式設計中,流程分為三種:順序流程、分支流程、迴圈流程。順序流程,即自頂而下,逐句執行的流程。分支流程,即兩個或多個分支,每次只走一個分支的流程。迴圈流程,即一段程式碼,重複地執行。我們前面所講的,全都是順序流程,現在講一下分支流程和迴圈流程。流程這塊,本是放到後面,等電子商城後臺系統寫好一些邏輯