案例一 switch-case会自动结束
下面这段代码会出现什么结果呢?
func test(a int) string {
switch a {
case 4:
case 3:
return "hit"
}
panic("noooo")
}
func main() {
fmt.Println(test(4))
}
如果在其它语言中,结果是打印出hit并结束程序,而在golang中将会产生panic异常!
原因是golang会在每个case结束时自动break掉,因此a=4时并不会return "hit"而是什么也不做。
对于这一点官方的解释是:
Go 的 switch 语句类似于 C、C++、Java、JavaScript 和 PHP 中的,不过 Go 只运行选定的 case,而非之后所有的 case。 实际上,Go 自动提供了在这些语言中每个 case 后面所需的
break
语句。 除非以fallthrough
语句结束,否则分支会自动终止。
案例二 for循环时参数变化
func main() {
a := []int{1,2,3,4}
for i := range a {
go func () {
fmt.Println(i, a[i])
}()
}
time.Sleep(1 * time.Second)
}
以上代码在我本地运行,打出的是:
3 4
3 4
3 4
3 4
这是由于在循环中位置变量i是唯一的,在循环中每次执行go fun()中使用到的i是同一个,在fmt.Println(i, a[i])时i值已经是不确定的。
有疑问加站长微信联系(非本文作者)