我知道switch
/ select
语句会在每个案例后自动中断。我想知道,在下面的代码中:
for {
switch sometest() {
case 0:
dosomething()
case 1:
break
default:
dosomethingelse()
}
}
break
语句是退出for
循环还是只退出switch
块?
答案 0 :(得分:155)
Break statements, The Go Programming Language Specification.
“break”语句终止执行最里面的“for”, “切换”或“选择”声明。
BreakStmt = "break" [ Label ] .
如果有标签,则必须是封闭的“for”,“switch” 或“select”语句,即执行终止的语句 (§对于陈述,§开关陈述,§选择陈述)。
L: for i < n { switch i { case 5: break L } }
因此,示例中的break
语句将终止switch
语句,即“最内层”语句。
答案 1 :(得分:40)
一个有希望的说明性例子:
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()
// ....
答案 2 :(得分:10)
是的,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.
答案 3 :(得分:7)
只是来自一个开关块。您可以检查Golang自己的代码中的大量示例(将inner break与outer break进行比较)。
答案 4 :(得分:2)
这个问题可能已经太老了,但是我仍然认为标签会使我们的代码变得更难阅读。 无需中断for内部选择,只需在调用break之前为循环设置一个标志并在select-case中处理它即可。 例如:
loop := true
for loop {
select {
case <-msg:
// do your task here
case <-ctx.Done():
loop = false
break
}
}
答案 5 :(得分:1)
这应该解释一下。
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")
}
}
}
将打印sjus ......清楚吗?
答案 6 :(得分:0)
它只退出开关块。
答案 7 :(得分:0)
break for switch的另一个用途是与fallthrough语句结合使用。可能需要一些创造力才能在正确的情况下正确使用它,但它可能是一种可用的组合。
这是一个简单的例子:
a := 25
fallThrough := true
switch {
case a > 10 :
fmt.Println("a>10")
if fallThrough != true {
break
}
fallthrough
case a > 20:
fmt.Println("a>20")
}