golang容易掉进的坑(一)

本文通过两个实例深入探讨Golang中的switch-case自动结束特性及for循环中参数变化导致的问题,揭示了Golang与传统语言在此方面的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

案例一 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值已经是不确定的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值