178

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

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

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

4

7 回答 7

240

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语句,即“最内层”语句。

于 2012-06-19T16:41:11.240 回答
70

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

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()
// ....
于 2012-06-19T15:38:42.330 回答
17

是的,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.
于 2016-09-04T17:54:31.170 回答
8

只是从一个开关块。您可以检查 Golang 自己的代码中的大量示例(比较内部 breakouter break)。

于 2012-06-19T15:21:57.403 回答
8

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

loop := true
for loop {
    select {
    case <-msg:
        // do your task here
    case <-ctx.Done():
        loop = false
        break
    }
}
于 2020-10-12T16:39:21.093 回答
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

于 2014-05-02T03:56:50.980 回答
0

它只退出 switch 块。

于 2012-06-19T15:19:08.660 回答