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

 

 

posted @ 2021-11-04 16:10  xiarunliang  阅读(630)  评论(0编辑  收藏  举报