以下代码等待“结果”频道为空 然后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")
答案 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标签