golang中for switch/select break的一点坑

来源:转载

还是之前的momo_worker项目,在运行中发现如果运行时间长了,会导致无法关闭,于是仔细研究了下go-workers代码,发现一个 for switch/select break的坑。

问题表现 for { select { case <- ch: break }}

上面这段代码中的break,不会跳出 for循环。

可以通过 http://play.golang.org/p/l01ImEBCwv这段代码详细看看。

问题原因与解决方法

这个问题在 golang的break statements语法规范里是这样描述的:

A "break" statement terminates execution of the innermost "for", "switch", or "select" statement within the same function.

BreakStmt = "break" [ Label ] .

If there is a label, it must be that of an enclosing "for", "switch", or "select" statement, and that is the one whose execution terminates.

OuterLoop: for i = 0; i < n; i++ {for j = 0; j < m; j++ {switch a[i][j] {case nil:state = Errorbreak OuterLoopcase item:state = Foundbreak OuterLoop}}}

简单来说, break是终止了 switch的运算,对于 for循环来说没有作用,这点对于 for select也一样,如果要终止 for循环,则需要使用label来标示跳出位置。

http://play.golang.org/p/pLQarqtZdg这段代码是之前的那段的修复版本。

分享给朋友:
您可能感兴趣的文章:
随机阅读: