go语言switch的一个小语法点,case执行顺序
学习一个视频教程时说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底层实现还没看,可能说的会有偏颇地方,以上只是做了个简单实验验证。

浙公网安备 33010602011771号