英文:
Why doesn't this code loop forever with a break label?
问题
我正在尝试弄清楚带标签的break语句是如何工作的。
我期望以下程序会一直打印"In if statement"。这是因为break here
语句将代码执行返回到for循环的开头,然后再次执行。
然而,这段代码只执行一次。我在这里漏掉了什么?
package main
import "fmt"
func main() {
here:
for {
fmt.Println("In if statement")
break here
}
fmt.Println("At the bottom")
}
执行结果:
In if statement
At the bottom
程序已退出。
链接:http://play.golang.org/p/y9kH1YZezJ
英文:
I am trying to figure out how break with labels works.
I expect the following program to keep printing "In if statement" forever. This is because the break here
statement brings the code execution back up to the beginning for loop which should then be executed again and again.
However, this code is only executed once. What am I missing here?
package main
import "fmt"
func main() {
here:
for {
fmt.Println("In if statement")
break here
}
fmt.Println("At the bottom")
}
Execution result:
In if statement
At the bottom
Program exited.
答案1
得分: 9
根据Go语言规范中关于"break语句"的说明:
如果有一个标签,那么它必须是一个包围着"for"、"switch"或"select"语句的标签,并且它是终止执行的那个语句。
break
语句并不会将代码返回到标签处,它只是终止由标签引用的循环。所以一切都正常运行...
英文:
From the go specification on break statements:
> If there is a label, it must be that of an enclosing "for", "switch", or "select" statement, and that is the one whose execution terminates.
The break
statement doesn't bring your code back to the label, it close the loop referenced by the label. So everything is working fine…
答案2
得分: 8
这是因为break语句将代码执行带回到标记的循环的开头。
不,break并不是goto语句。它是用来退出标记的循环的。执行会继续在循环之后进行。
在这个特定的例子中,标记是不必要的,你可以默认地通过break语句退出最内层的循环来达到相同的结果(无需使用标记)。
英文:
> This is because the break here statement brings the code execution back up to the beginning for loop
No, that is not what break does. It is not a goto. It exits the loop marked with the label. Execution continues after the loop.
In this particular example, the label is unneccessary, you would be getting the same result by breaking out of the innermost loop by default (without a label).
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论