在Go中,break语句是否从switch / select中断?


144

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

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

是否break声明退出for循环或只是switch块?

Answers:


199

Break语句,《 Go编程语言规范》。

“ break”语句终止最里面的“ for”,“ switch”或“ select”语句的执行。

BreakStmt = "break" [ Label ] .

如果有标签,则必须是一个封闭的“ for”,“ switch”或“ select”语句的标签,并且该标签的执行终止(§For语句,§Switch语句,§Select语句)。

L:
  for i < n {
      switch i {
      case 5:
          break L
      }
  }

因此,break示例中的switch语句终止该语句,即“最内层”语句。


4
由于只能选择一个,因此break内部的用例是什么?select {}case
Julio Guerra

3
因为即使选择了单个案例,它也可能具有更长的实现,该实现使用break来终止案例的执行,就像您可以从函数中的任何位置返回一样。
山雀佩特里克

那不是一个不好的打算吗?因为转到语句是一个糟糕的选择,并且switch / select语句会自动中断
John Balvin Arias

55

一个有希望的说明性示例:

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

14

是的,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.


2

这应该可以解释。

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 ...清楚吗?

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


3
嗯,我包括了一个去比赛的链接,这可能会有所帮助。
Jasmeet Singh'7

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.