Break 语句是否从 switch/select 中断开?

我知道 switch/select语句在每个情况下都会自动中断:

for {
switch sometest() {
case 0:
dosomething()
case 1:
break
default:
dosomethingelse()
}
}

break语句是退出 for循环还是仅退出 switch块?

146680 次浏览

它只会离开交换机。

在 Golang 自己的代码中有很多例子你可以研究(比较 内心破碎外围休息)。

一个很有说服力的例子:

loop:
for {
switch expr {
case foo:
if condA {
doA()
break // like 'goto A'
}


if condB {
doB()
break loop // like 'goto B'
}


doC()
case bar:
// ...
}
A:
doX()
// ...
}


B:
doY()
// ....

中断语句,围棋编程语言规范。

“ break”语句终止执行最内部的“ for”, “ switch”或“ select”语句。

BreakStmt = "break" [ Label ] .

如果有一个标签,它必须是一个封闭的“为”,“开关” 或者“ select”语句,并且该语句的执行将终止 (对于语句,Switch 语句,Select 语句)。

L:
for i < n {
switch i {
case 5:
break L
}
}

因此,示例中的 break语句将终止 switch语句,即“最内层”语句。

这就能解释了。

for{
x := 1
switch {
case x >0:
fmt.Println("sjus")
case x == 1:
fmt.Println("GFVjk")
default:
fmt.Println("daslkjh")
}
}
}

永不停歇

for{
x := 1
switch {
case x >0:
fmt.Println("sjus")
break
case x == 1:
fmt.Println("GFVjk")
default:
fmt.Println("daslkjh")
}
}
}

再说一遍,永远逃不掉

但是

package main


import "fmt"


func main() {
d:
for{
x := 1
switch {
case x >0:
fmt.Println("sjus")
break d
case x == 1:
fmt.Println("GFVjk")
default:
fmt.Println("daslkjh")
}
}
}

将印刷合法 明白了吗?

Http://play.golang.org/p/govnfi67ih

是的,break破坏了内部 switch

Https://play.golang.org/p/szdduvjic4

package main


import "fmt"


func main() {


myloop:
for x := 0; x < 7; x++ {
fmt.Printf("%d", x)
switch {
case x == 1:
fmt.Println("start")
case x == 5:
fmt.Println("stop")
break myloop
case x > 2:
fmt.Println("crunching..")
break
default:
fmt.Println("idling..")
}
}
}
0idling..
1start
2idling..
3crunching..
4crunching..
5stop


Program exited.

这个问题可能已经太老了,但我仍然认为 label 使我们的代码变得更难阅读。 与其中断 for inside select,不如为循环设置一个标志,并在调用 break 之前在 select-case 中处理它。 例如:

loop := true
for loop {
select {
case <-msg:
// do your task here
case <-ctx.Done():
loop = false
break
}
}

更新: 完全同意 Vaelin 的评论。在 for 循环的范围内声明这个标志可以避免内存泄漏和与当前范围内的其他变量发生冲突,以防我们已经有了相同的变量名。

for loop := true; loop; {


}