ChatGPT解决这个技术问题 Extra ChatGPT

Does a break statement break from a switch/select?

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?


p
peterSO

Break statements, The Go Programming Language Specification. 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.


What's the use case of the break within select {} since only one case can be selected?
Because even if a single case is selected, it might have a longer implementation which uses break to terminate the execution of the case, much like you can return from anywhere in a function.
z
zzzz

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()
// ....

A
Antoine Cotten

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.


this answer does not demonstrate how the break statement without label can be useful. the break statement in case x > 2: is effectively a no-op.
H
HaiTH

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
    }
}

If you don't want to leak the loop variable you can also declare it inside the scope of the for loop for loop := true; loop; {}. Playground: play.golang.org/p/dNChUECkbfd
r
raina77ow

Just from a switch block. There's plenty of examples in Golang own code you can examine (compare inner break with outer break).


J
Jasmeet Singh

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


hmmm I included a go play link, which might be helpful.
A
AJ Richardson

It only exits the switch block.