Does a break statement break from a switch/select?
SelectSwitch StatementGoBreakSelect Problem Overview
I know that switch
/select
statements break automatically after every case. I am wondering, in the following code:
for {
switch sometest() {
case 0:
dosomething()
case 1:
break
default:
dosomethingelse()
}
}
Does the break
statement exit the for
loop or just the switch
block?
Select Solutions
Solution 1 - Select
> [Break statements, The Go Programming Language Specification.][1] > > A "break" statement terminates execution of the innermost "for", > "switch" or "select" statement. > > 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 > (§For statements, §Switch statements, §Select statements). > > L: > for i < n { > switch i { > case 5: > break L > } > }
Therefore, the break
statement in your example terminates the switch
statement, the "innermost" statement.
[1]: http://golang.org/ref/spec#Break_statements
Solution 2 - Select
A hopefully illustrative example:
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()
// ....
Solution 3 - Select
Yes, break
breaks the inner 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.
Solution 4 - Select
This question might be too old already but I still think label makes our code become harder to read. Instead of breaking the for inside select, just set a flag for the loop and handle it inside select-case before invoking break. For example:
loop := true
for loop {
select {
case <-msg:
// do your task here
case <-ctx.Done():
loop = false
break
}
}
Solution 5 - Select
Just from a switch block. There's plenty of examples in Golang own code you can examine (compare inner break with outer break).
Solution 6 - Select
this should explain it.
for{
x := 1
switch {
case x >0:
fmt.Println("sjus")
case x == 1:
fmt.Println("GFVjk")
default:
fmt.Println("daslkjh")
}
}
}
Runs forever
for{
x := 1
switch {
case x >0:
fmt.Println("sjus")
break
case x == 1:
fmt.Println("GFVjk")
default:
fmt.Println("daslkjh")
}
}
}
Again, runs forever
BUT
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")
}
}
}
will print sjus ... clear ?
Solution 7 - Select
It only exits the switch block.