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
系列導讀
11. Go語言流程式控制制:switch-case 選擇語句
24. 超詳細解讀 Go Modules 前世今生及入門使用