學習一個視頻教程時說go里的switch中case是從上往下執行,直到一個case結果是true,開始執行其中的語句塊。
之前學習的時候沒注意到這個。以為是和c++一樣是直接hash命中要執行的case。
試了下,結果是和視頻中說的一致的。實驗代碼如下:
func func2() bool { fmt.Println("run in func2") return false } func func3() bool { fmt.Println("run in func3") return true } func func4() bool { fmt.Println("run in func4") return true } func testSwitch() { switch { case func1(): fmt.Println("into 1") case func2(): fmt.Println("into 2") case func3(): fmt.Println("into 3") case func4(): fmt.Println("into 4") } fmt.Println("testSwitch run end") }
運行結果:
run in func1
run in func2
run in func3
into 3
其實也是,回想c++,它的switch是有很多限制,case里的需要是整型或枚舉,所以它能做到hash。而go對於這個switch寫法,,它這沒這效率的考慮,設計的方便寬廣的多,而想hash也是hash不了的吧。
不過,可能就要考慮一些case里表達式會被執行的一些副作用影響,寫代碼時候需要注意些。
而且從上往下都執行,可能,和if相比差別也就是語法靈活性上、或者表達清晰上,選擇時,也沒有效率考慮啥事了。
后面也試了下正常些的go的 switch寫法 switch 處有個變量,做匹配判斷的:
func testSwitch() { var iv int = 3 switch iv { case func1int(): fmt.Println("into 1") case func2int(): fmt.Println("into 2") case func3int(): fmt.Println("into 3") case func3int(): fmt.Println("into 4") } fmt.Println("testSwitch run end") }
其中幾個case的函數返回的分別是整型 1,2,3,4。執行結果還是這樣:
run in func1
run in func2
run in func3
into 3
go的siwtch底層實現還沒看,可能說的會有偏頗地方,以上只是做了個簡單實驗驗證。