9. Go 語言流程式控制制:switch-case

来源:https://www.cnblogs.com/wongbingming/archive/2020/05/01/12814165.html
-Advertisement-
Play Games

Hi,大家好,我是明哥。 在自己學習 Golang 的這段時間里,我寫了詳細的學習筆記放在我的個人微信公眾號 《Go編程時光》,對於 Go 語言,我也算是個初學者,因此寫的東西應該會比較適合剛接觸的同學,如果你也是剛學習 Go 語言,不防關註一下,一起學習,一起成長。 我的線上博客:http://g ...


Hi,大家好,我是明哥。

在自己學習 Golang 的這段時間里,我寫了詳細的學習筆記放在我的個人微信公眾號 《Go編程時光》,對於 Go 語言,我也算是個初學者,因此寫的東西應該會比較適合剛接觸的同學,如果你也是剛學習 Go 語言,不防關註一下,一起學習,一起成長。

我的線上博客:http://golang.iswbm.com
我的 Github:github.com/iswbm/GolangCodingTime


Go里的流程式控制制方法還是挺豐富,整理了下有如下這麼多種:

  • if - else 條件語句
  • switch - case 選擇語句
  • for - range 迴圈語句
  • goto 無條件跳轉語句
  • defer 延遲執行

上一篇講了 if -else 條件語句,今天先來講講 switch - case 選擇語句。

0. 語句模型

Go 里的選擇語句模型是這樣的

switch 表達式 {
    case 表達式1:
    	代碼塊
    case 表達式2:
    	代碼塊
    case 表達式3:
    	代碼塊
    case 表達式4:
    	代碼塊
    case 表達式5:
    	代碼塊
    default:
    	代碼塊
}

拿 switch 後的表達式分別和 case 後的表達式進行對比,只要有一個 case 滿足條件,就會執行對應的代碼塊,然後直接退出 switch - case ,如果 一個都沒有滿足,才會執行 default 的代碼塊。

1. 最簡單的示例

switch 後接一個你要判斷變數 education (學歷),然後 case 會拿這個 變數去和它後面的表達式(可能是常量、變數、表達式等)進行判等。

如果相等,就執行相應的代碼塊。如果不相等,就接著下一個 case。

import "fmt"

func main() {
	education := "本科"

	switch education {
	case "博士":
		fmt.Println("我是博士")
	case "研究生":
		fmt.Println("我是研究生")
	case "本科":
		fmt.Println("我是本科生")
	case "大專":
		fmt.Println("我是大專生")
	case "高中":
		fmt.Println("我是高中生")
    default:
        fmt.Println("學歷未達標..")
	}
}

輸出如下

我是本科生

2. 一個 case 多個條件

case 後可以接多個多個條件,多個條件之間是 的關係,用逗號相隔。

import "fmt"

func main() {
	month := 2

	switch month {
	case 3, 4, 5:
		fmt.Println("春天")
	case 6, 7, 8:
		fmt.Println("夏天")
	case 9, 10, 11:
		fmt.Println("秋天")
	case 12, 1, 2:
		fmt.Println("冬天")
	default:
		fmt.Println("輸入有誤...")
	}
}

輸出如下

冬天

3. case 條件常量不能重覆

當 case 後接的是常量時,該常量只能出現一次。

以下兩種情況,在編譯時,都會報錯: duplicate case "male" in switch

錯誤案例一

gender := "male"

switch gender {
    case "male":
    	fmt.Println("男性")
    // 與上面重覆
    case "male":
    	fmt.Println("男性")
    case "female":
    	fmt.Println("女性")
}

錯誤案例二

gender := "male"

switch gender {
    case "male", "male":
    	fmt.Println("男性")
    case "female":
    	fmt.Println("女性")
}

4. switch 後可接函數

switch 後面可以接一個函數,只要保證 case 後的值類型與函數的返回值 一致即可。

import "fmt"

// 判斷一個同學是否有掛科記錄的函數
// 返回值是布爾類型
func getResult(args ...int) bool {
	for _, i := range args {
		if i < 60 {
			return false
		}
	}
	return true
}

func main() {
	chinese := 80
	english := 50
	math := 100

	switch getResult(chinese, english, math) {
    // case 後也必須 是布爾類型
	case true:
		fmt.Println("該同學所有成績都合格")
	case false:
		fmt.Println("該同學有掛科記錄")
	}
}

5. switch 可不接表達式

switch 後可以不接任何變數、表達式、函數。

當不接任何東西時,switch - case 就相當於 if - elseif - else

score := 30

switch {
    case score >= 95 && score <= 100:
        fmt.Println("優秀")
    case score >= 80:
        fmt.Println("良好")
    case score >= 60:
        fmt.Println("合格")
    case score >= 0:
        fmt.Println("不合格")
    default:
        fmt.Println("輸入有誤...")
}

6. switch 的穿透能力

正常情況下 switch - case 的執行順序是:只要有一個 case 滿足條件,就會直接退出 switch - case ,如果 一個都沒有滿足,才會執行 default 的代碼塊。

但是有一種情況是例外。

那就是當 case 使用關鍵字 fallthrough 開啟穿透能力的時候。

s := "hello"
switch {
case s == "hello":
    fmt.Println("hello")
    fallthrough
case s != "world":
    fmt.Println("world")
}

代碼輸出如下:

hello
world

需要註意的是,fallthrough 只能穿透一層,意思是它只給你一次再判斷case的機會,不管你有沒有匹配上,都要退出了。

s := "hello"
switch {
case s == "hello":
	fmt.Println("hello")
	fallthrough
case s == "xxxx":
	fmt.Println("xxxx")
case s != "world":
	fmt.Println("world")
}

輸出如下,並不會輸出 world(即使它符合條件)

hello
xxxx

系列導讀

01. 開發環境的搭建(Goland & VS Code)

02. 學習五種變數創建的方法

03. 詳解數據類型:****整形與浮點型

04. 詳解數據類型:byte、rune與string

05. 詳解數據類型:數組與切片

06. 詳解數據類型:字典與布爾類型

07. 詳解數據類型:指針

08. 面向對象編程:結構體與繼承

09. 一篇文章理解 Go 里的函數

10. Go語言流程式控制制:if-else 條件語句

11. Go語言流程式控制制:switch-case 選擇語句

12. Go語言流程式控制制:for 迴圈語句

13. Go語言流程式控制制:goto 無條件跳轉

14. Go語言流程式控制制:defer 延遲調用

15. 面向對象編程:介面與多態

16. 關鍵字:make 和 new 的區別?

17. 一篇文章理解 Go 里的語句塊與作用域

18. 學習 Go 協程:goroutine

19. 學習 Go 協程:詳解通道/通道

20. 幾個通道死鎖經典錯誤案例詳解

21. 學習 Go 協程:WaitGroup

22. 學習 Go 協程:互斥鎖和讀寫鎖

23. Go 里的異常處理:panic 和 recover

24. 超詳細解讀 Go Modules 前世今生及入門使用

25. Go 語言中關於包導入必學的 8 個知識點

26. 如何開源自己寫的模塊給別人用?

27. 說說 Go 語言中的類型斷言?

28. 這五點帶你理解Go語言的select用法



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. Image.open(fp, mode="r") 調用此方法需要引入頭文件:from PIL import Image。 參數說明: fp:圖片路徑,可為絕對路徑或相對路徑。 model:預設即可。 2. 例子 2.1 Code 首先給定圖片路徑,然後調用函數Image.open()即可。 1 ...
  • 一、準備環境 1. 雲主機和功能變數名稱 雲主機 推薦使用阿裡雲或者騰訊雲的ecs主機,如果有學生證的話都很便宜。 功能變數名稱 國內的話,在阿裡雲或者騰訊雲購買都可以,國內功能變數名稱都需要備案,備案按照文檔去做。 ssl證書 雲服務商一般都有免費的ssl證書申請,也可以使用let's encrypt的證書。 2. 公眾 ...
  • 1. cv2.imread(filename, flags=None) 需要引入頭文件: import cv2 參數說明: filename: 文件路徑,絕對路徑和相對路徑都可以。 2. 例子 2.1 Code 首先定義路徑,然後直接調用函數cv2.imread()即可。 1 import cv2 ...
  • 1. repeat_interleave(self: Tensor, repeats: _int, dim: Optional[_int]=None) 參數說明: self: 傳入的數據為tensor repeats: 複製的份數 dim: 要複製的維度,可設定為0/1/2..... 2. 例子 2 ...
  • SpringBoot(十二)過濾器詳解 往期精彩推薦 "SpringBoot系列(一)idea新建Springboot項目" "SpringBoot系列(二)入門知識" "springBoot系列(三)配置文件詳解" "SpringBoot系列(四)web靜態資源配置詳解" "SpringBoot系 ...
  • 1. MQ的優缺點 優點: 解耦:通過MQ解除上游系統和下游系統的調用耦合,下游系統只需要做消息的訂閱和取消訂閱,上游系統無需任何改動。(一生產,多消費的典型場景) 非同步:通過MQ將一些不需要同步獲取執行的結果,並且非常耗時的調用操作通過MQ非同步化。 削峰:通過MQ將一些高峰期的高併發流量積壓在MQ ...
  • maven settings.xml 每次重裝maven都需要配置settings.xml所以在這裡記錄一下 win linux 【微信】打賞二維碼: 【支付寶】打賞二維碼: ...
  • 前言 理解原型和原型鏈,有助於更好的理解JavaScript中的繼承機制。 最近比較有空,所以想寫一篇關於原型和原型鏈的文章,如寫得不好請見諒。 原型對象 無論什麼時候,只要創建了一個新函數,就會根據一組特定的規則為該函數創建一個 prototype 屬性,這個屬性指向函數的原型對象。在預設情況下, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...