break 语句是不是从 switch/select 中断?

Posted

技术标签:

【中文标题】break 语句是不是从 switch/select 中断?【英文标题】:Does a break statement break from a switch/select?break 语句是否从 switch/select 中断? 【发布时间】:2012-06-21 16:14:01 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

这个答案没有说明没有标签的break 语句如何有用。 case x &gt; 2: 中的 break 语句实际上是一个空操作。【参考方案2】:

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

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

【讨论】:

如果你不想泄露循环变量,你也可以在for循环for loop := true; loop; 的范围内声明它。游乐场:play.golang.org/p/dNChUECkbfd【参考方案3】:

只是从一个开关块。 Golang 自己的代码中有很多示例可供您检查(比较 inner break 和 outer break)。

【讨论】:

【参考方案4】:

它只退出开关块。

【讨论】:

【参考方案5】:

这应该可以解释。

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

【讨论】:

嗯,我添加了一个 go play 链接,这可能会有所帮助。【参考方案6】:

Break statements, The Go Programming Language Specification.

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

BreakStmt = "break" [ Label ] .

如果有标签,它必须是一个封闭的“for”,“switch” 或“选择”语句,这是执行终止的语句 (§For 语句、§Switch 语句、§Select 语句)。

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

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

【讨论】:

select 中的break 只能选择一个case 的用例是什么? 因为即使选择了单个 case,它也可能有一个更长的实现,它使用 break 来终止 case 的执行,就像你可以从函数中的任何地方返回一样。【参考方案7】:

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

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 语句是不是从 switch/select 中断?的主要内容,如果未能解决你的问题,请参考以下文章

break continue return

c语言switch语句中break的用法

写switch case语句不加break会怎样

流程控制之 break ,continue,return的区别

switch语句后面不加break结果是啥?

说明在循环中使用break和continue,return语句之间的区别