Does a break statement break from a switch/select?

SelectSwitch StatementGoBreak

Select 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 ?

http://play.golang.org/p/GOvnfI67ih

Solution 7 - Select

It only exits the switch block.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMattView Question on Stackoverflow
Solution 1 - SelectpeterSOView Answer on Stackoverflow
Solution 2 - SelectzzzzView Answer on Stackoverflow
Solution 3 - Selectanatoly techtonikView Answer on Stackoverflow
Solution 4 - SelectHaiTHView Answer on Stackoverflow
Solution 5 - Selectraina77owView Answer on Stackoverflow
Solution 6 - SelectJasmeet SinghView Answer on Stackoverflow
Solution 7 - SelectSebastianView Answer on Stackoverflow