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

时间:2012-06-19 15:16:11

标签: select switch-statement go break

我知道switch / select语句会在每个案例后自动中断。我想知道,在下面的代码中:

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

break语句是退出for循环还是只退出switch块?

8 个答案:

答案 0 :(得分:155)

  

Break statements, The Go Programming Language Specification.

     

“break”语句终止执行最里面的“for”,   “切换”或“选择”声明。

BreakStmt = "break" [ Label ] .
     

如果有标签,则必须是封闭的“for”,“switch”   或“select”语句,即执行终止的语句   (§对于陈述,§开关陈述,§选择陈述)。

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

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

答案 1 :(得分:40)

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

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

答案 2 :(得分:10)

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

答案 3 :(得分:7)

只是来自一个开关块。您可以检查Golang自己的代码中的大量示例(将inner breakouter break进行比较)。

答案 4 :(得分:2)

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

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

答案 5 :(得分:1)

这应该解释一下。

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

答案 6 :(得分:0)

它只退出开关块。

答案 7 :(得分:0)

break for switch的另一个用途是与fallthrough语句结合使用。可能需要一些创造力才能在正确的情况下正确使用它,但它可能是一种可用的组合。

这是一个简单的例子:

a := 25
fallThrough := true

switch {
case a > 10 :
    fmt.Println("a>10")
    if fallThrough != true {
        break
    }
    fallthrough
case a > 20:
    fmt.Println("a>20")
}