选择完成后,FOR循环中断的方式如何

时间:2016-02-17 00:22:32

标签: go

以下代码等待“结果”频道为空 然后DEFAULT分支断开标签DONE。

现在的问题是:为什么这会破坏FOR LOOP?它似乎 FOR循环将继续跳到DEFAULT,永远不会 端。

什么是打破循环。

输出如下:

Break DONE

结束

...
DONE:
for {
    select { // Nonblocking
    case result := <-results:
        fmt.Printf("%s:%d:%s\n", result.filename, result.lino,
            result.line)
    default:
        fmt.Println("Break DONE")
        break DONE
    }
    fmt.Println("END Select")
}
fmt.Println("End For")

4 个答案:

答案 0 :(得分:2)

break DONE与C或其他语言中的goto DONE不同。标签标记for循环,break DONE语句在执行时将终止。它不会跳转到DONE标签,它会终止标有DONE标签的for循环。当您想要从嵌套循环中断时,或者在您的情况下,从select内部终止循环时,标记的中断非常有用。没有标签中断只会终止选择。

答案 1 :(得分:1)

  

如果有标签,则必须是封闭的&#34;对于&#34;,&#34;开关&#34;或&#34;选择&#34;语句,即执行终止的语句。

https://golang.org/ref/spec#Break_statements

此示例中的标签明确标记&#34; for&#34;终止。

答案 2 :(得分:0)

这种混乱来自于你要在第一种情况下阻止那里的想法。这不是发生的事情。您可以无限期地迭代选择选项,直到遇到中断。在这种情况下,它表示在第一次迭代时没有任何内容从results频道收到,因此它会自动落入默认原因,打印Break DONE并且您已完成。

答案 3 :(得分:0)

break关键字用于终止执行,当你调试这段代码时,会选择默认选项然后break关键字执行哪个停止程序。程序无法进入DONE标签