前言
这是 Go 十大常见谬误系列的第 4 篇:for/switch 和 for/select 做 break 操作退出的注意事项。素材来源于 Go 布道者,现 Docker 公司资深工程师 Teiva Harsanyi。
本文波及的源代码全副开源在:Go 十大常见谬误源代码,欢送大家关注公众号,及时获取本系列最新更新。
场景
案例 1
大家看看上面这段代码:
for {switch f() {
case true:
break
case false:
// Do something
}
}
如果函数调用 f()
返回的后果是 true
,进入到case true
分支,会产生什么?会退出 for 循环么?
答案是:只退出了 switch 语句,并不会退出 for 循环,所以 break 后又继续执行 for 循环里的代码。
案例 2
再看上面这段代码
for {
select {
case <-ch:
// Do something
case <-ctx.Done():
break
}
}
同样地,如果执行了 break 语句,退出的只是 select 语句块,并不会退出 for 循环。
那在下面 2 种场景里,如何退出 for 循环呢?
能够联合 label 和 break 进行实现。
loop:
for {
select {
case <-ch:
// Do something
case <-ctx.Done():
break loop
}
}
对于下面的代码,loop 是一个 label,break loop
如果执行了就会退出 for 循环。
举荐浏览
- Go 十大常见谬误第 1 篇:未知枚举值
- Go 十大常见谬误第 2 篇:benchmark 性能测试的坑
- Go 十大常见谬误第 3 篇:go 指针的性能问题和内存逃逸
- Go switch 应用阐明
- Go for/break 应用阐明
- Go select 语义
开源地址
文章和示例代码开源在 GitHub: Go 语言高级、中级和高级教程。
公众号:coding 进阶。关注公众号能够获取最新 Go 面试题和技术栈。
集体网站:Jincheng’s Blog。
知乎:无忌。
福利
我为大家整顿了一份后端开发学习材料礼包,蕴含编程语言入门到进阶常识(Go、C++、Python)、后端开发技术栈、面试题等。
关注公众号「coding 进阶」,发送音讯 backend 支付材料礼包,这份材料会不定期更新,退出我感觉有价值的材料。还能够发送音讯「进群」,和同行一起交流学习,答疑解惑。
References
- https://itnext.io/the-top-10-…
- https://github.com/jincheng9/…
- https://github.com/jincheng9/…