break语句是否与switch/select语句断开?

break语句是否与switch/select语句断开?,select,switch-statement,go,break,Select,Switch Statement,Go,Break,我知道switch/select语句在每个情况下都会自动中断。我想知道,在以下代码中: for { switch sometest() { case 0: dosomething() case 1: break default: dosomethingelse() } } break语句是退出for循环还是仅退出开关块?它仅退出开关块。仅从开关块退出。在Golang自己的代码中有很多示例,您可以进行检查(比

我知道
switch
/
select
语句在每个情况下都会自动中断。我想知道,在以下代码中:

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

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

它仅退出开关块。

仅从开关块退出。在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”的执行, “开关”或“选择”语句

BreakStmt = "break" [ Label ] .
如果有标签,则必须是包含“for”、“switch”的标签 或“select”语句,即其执行终止的语句 (§For语句、§Switch语句、§Select语句)

L:
对于i

因此,示例中的
break
语句终止了
switch
语句,即“最里面的”语句。

这应该可以解释它

BreakStmt = "break" [ Label ] .
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")
    }
}
}
再一次,永远运行

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

将打印SJU ... 明白了吗


是,
break
断开内部的
开关

主程序包
输入“fmt”
func main(){
myloop:
对于x:=0;x<7;x++{
fmt.Printf(“%d”,x)
开关{
案例x==1:
fmt.Println(“开始”)
案例x==5:
fmt.Println(“停止”)
断开myloop
案例x>2:
fmt.Println(“嘎吱作响”)
打破
违约:
fmt.Println(“怠速…”)
}
}
}

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

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

case hmmm I包含一个go-play链接,这可能会有帮助。在
select{
因为只能选择一个
案例
?因为即使选择了一个案例,它也可能有一个较长的实现,使用break终止案例的执行,就像您可以从函数中的任何位置返回一样。如果您不想泄漏循环变量,也可以在for循环的范围内声明它
for loop:=true;loop;{}
。操场:这个答案没有说明没有标签的
break
语句是如何有用的。案例x>2:
中的
break
语句实际上是不可操作的。
loop := true
for loop {
    select {
    case <-msg:
        // do your task here
    case <-ctx.Done():
        loop = false
        break
    }
}