golang switch語(yǔ)句的靈活寫(xiě)法介紹
switch是很容易理解的,先來(lái)個(gè)代碼,運(yùn)行起來(lái)
看看你的操作系統(tǒng)是什么吧
package main import ( "fmt" "runtime" ) func main() { fmt.Print("Go runs on ") switch os := runtime.GOOS; os { case "darwin": fmt.Println("OS X.") case "linux": fmt.Println("Linux.") default: fmt.Printf("%s", os) } }
runtine運(yùn)行時(shí)獲取當(dāng)前的操作系統(tǒng),使用GOOS。還和if for之類(lèi)的習(xí)慣一樣,可以在前面聲明賦值變量。我們就在這里來(lái)獲取操作系統(tǒng)的信息了。
os := runtime.GOOS;
{}里的case比較容易理解。操作系統(tǒng)是 "darwin" 就打印"OS X.";操作系統(tǒng)是 "linux" 就打印"Linux";其他的都直接打印系統(tǒng)類(lèi)別。
在go語(yǔ)言的switch中除非以fallthrough語(yǔ)句結(jié)束,否則分支會(huì)自動(dòng)終止。
所以修改一下上面的代碼,再運(yùn)行一下:
package main import ( "fmt" "runtime" ) func main() { fmt.Print("Go runs on ") switch os := runtime.GOOS; os { case "darwin": fmt.Println("OS X.") case "linux": fmt.Println("Linux.") case "windows": fmt.Println("win") fallthrough default: fmt.Printf("%s", os) } }
增加了當(dāng)前的系統(tǒng)的case選項(xiàng)"windows",還在這個(gè)分支使用了fallghrough。
如果你再注釋掉 fallthrough,或干脆刪除 fallthrough,再運(yùn)行,就會(huì)發(fā)現(xiàn),那個(gè)穿透的效果沒(méi)有了。
總結(jié)
switch 的條件從上到下的執(zhí)行,當(dāng)匹配成功的時(shí)候停止。如果匹配成功的這個(gè)分支是以fallthrough結(jié)束的,那么下一個(gè)緊鄰的分支也會(huì)被執(zhí)行。
switch的沒(méi)有條件的用法。這其實(shí)相當(dāng)于switch true一樣。每一個(gè)case選項(xiàng)都是bool表達(dá)式,值為true的分支就會(huì)被執(zhí)行,或者執(zhí)行default。
package main import ( "fmt" "time" ) func main() { t := time.Now() switch { case t.Hour() > 12: fmt.Println("Morning was passed.") case t.Hour() > 17: fmt.Println("Afternoon was passed.") default: fmt.Println("Now too early.") } }
補(bǔ)充:記Golang switch的一個(gè)“坑”
switch分支語(yǔ)句在各個(gè)編程語(yǔ)言中都很常用,能夠根據(jù)條件選中一個(gè)或多個(gè)case語(yǔ)句進(jìn)行執(zhí)行,習(xí)慣于C、C++語(yǔ)言編程的都知道,在C、C++中switch分支判斷條件會(huì)依次遍歷每個(gè)case,當(dāng)遇到符合條件的case時(shí),便會(huì)執(zhí)行該case中的語(yǔ)句,直到遇到case中顯示的break語(yǔ)句才會(huì)終止switch流程,如果一個(gè)case中沒(méi)有顯示的break此case,程序便會(huì)執(zhí)行下一個(gè)case(如果存在的話(huà))。
對(duì)于從C、C++剛轉(zhuǎn)到Go語(yǔ)言的程序員來(lái)說(shuō),這里面便存在一個(gè)“坑”,本人在開(kāi)發(fā)過(guò)程中也踩過(guò)這個(gè)“坑”,那便是Go語(yǔ)言在switch分支語(yǔ)句的每個(gè)case中會(huì)自動(dòng)加上一個(gè)break語(yǔ)句,也就是說(shuō)在Go語(yǔ)言中程序進(jìn)入了一個(gè)case流程,不管程序中有沒(méi)有顯示的break此case,程序都不會(huì)繼續(xù)執(zhí)行其他的case流程,而是直接退出整個(gè)switch流程,這里做一個(gè)簡(jiǎn)單的實(shí)驗(yàn)。
顯示的在每個(gè)case中添加上break語(yǔ)句:
package main import "fmt" func main() { var num = 10 switch num { case 5: fmt.Println("num is 5") break case 10: fmt.Println("num is 10") break case 15: fmt.Println("num is 15") break default: fmt.Println("num is default branch") } return }
程序的運(yùn)行結(jié)果如下:
num is 10
下面去掉每個(gè)case中顯示的break語(yǔ)句,看看結(jié)果是什么呢。
package main import "fmt" func main() { var num = 10 switch num { case 5: fmt.Println("num is 5") case 10: fmt.Println("num is 10") case 15: fmt.Println("num is 15") default: fmt.Println("num is default branch") } return }
程序的運(yùn)行結(jié)果如下:
num is 10
很明顯,在每個(gè)case語(yǔ)句中是否顯示的添加break語(yǔ)句都只會(huì)執(zhí)行其中的一個(gè)分支流程,這對(duì)于想要通過(guò)break來(lái)控制每次執(zhí)行case數(shù)量的程序員來(lái)說(shuō)確實(shí)是一個(gè)不大不小的“坑”。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
GO語(yǔ)言實(shí)現(xiàn)的http抓包分析工具pproxy介紹
這篇文章主要介紹了GO語(yǔ)言實(shí)現(xiàn)的http抓包分析工具pproxy介紹,本文同時(shí)對(duì)比了Fiddler、Charles等抓包軟件,需要的朋友可以參考下2015-03-03Go語(yǔ)言開(kāi)發(fā)代碼自測(cè)絕佳go?fuzzing用法詳解
這篇文章主要為大家介紹了Go語(yǔ)言開(kāi)發(fā)代碼自測(cè)絕佳go?fuzzing用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Go語(yǔ)言kube-scheduler深度剖析與開(kāi)發(fā)之pod調(diào)度
這篇文章主要為大家介紹了Go語(yǔ)言kube-scheduler深度剖析與開(kāi)發(fā),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04golang 后臺(tái)進(jìn)程的啟動(dòng)和停止操作
這篇文章主要介紹了golang 后臺(tái)進(jìn)程的啟動(dòng)和停止操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04