学习一个视频教程时说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底层实现还没看,可能说的会有偏颇地方,以上只是做了个简单实验验证。