标签 - break vs continue vs goto
Labels - break vs continue vs goto
我明白了:
break
- 停止进一步执行循环结构。
continue
- 跳过循环体的其余部分并开始下一次迭代。
但是这些陈述与标签结合使用时有何不同?
也就是说这三个循环有什么区别:
Loop:
for i := 0; i < 10; i++ {
if i == 5 {
break Loop
}
fmt.Println(i)
}
输出:
0 1 2 3 4
Loop:
for i := 0; i < 10; i++ {
if i == 5 {
continue Loop
}
fmt.Println(i)
}
输出:
0 1 2 3 4 6 7 8 9
Loop:
for i := 0; i < 10; i++ {
if i == 5 {
goto Loop
}
fmt.Println(i)
}
输出:
0 1 2 3 4 0 1 2 3 4 ...(无限)
对于 break
和 continue
,附加标签可让您指定要引用的循环。例如,您可能希望 break
/continue
外循环而不是嵌套的循环。
这是来自 Go Documentation 的示例:
RowLoop:
for y, row := range rows {
for x, data := range row {
if data == endOfRow {
continue RowLoop
}
row[x] = data + bias(x, y)
}
}
即使当前正在迭代行中的列(数据),这也能让您进入下一个“行”。这是有效的,因为标签 RowLoop
通过直接在外循环之前“标记”外循环。
break
可以以相同的方式使用相同的机制。这是 Go Documentation 中的一个示例,说明当 break
语句在 switch 语句内部时可用于跳出循环。如果没有标签,go 会认为你是在跳出 switch 语句,而不是循环(这就是你想要的,在这里)。
OuterLoop:
for i = 0; i < n; i++ {
for j = 0; j < m; j++ {
switch a[i][j] {
case nil:
state = Error
break OuterLoop
case item:
state = Found
break OuterLoop
}
}
}
对于goto
,这是比较传统的。它使程序执行 Label, next 处的命令。在您的示例中,这会导致无限循环,因为您会反复进入循环的开头。
文档时间
对于break
:
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.
对于continue
:
If there is a label, it must be that of an enclosing "for" statement, and that is the one whose execution advances.
我明白了:
break
- 停止进一步执行循环结构。
continue
- 跳过循环体的其余部分并开始下一次迭代。
但是这些陈述与标签结合使用时有何不同?
也就是说这三个循环有什么区别:
Loop:
for i := 0; i < 10; i++ {
if i == 5 {
break Loop
}
fmt.Println(i)
}
输出:
0 1 2 3 4
Loop:
for i := 0; i < 10; i++ {
if i == 5 {
continue Loop
}
fmt.Println(i)
}
输出:
0 1 2 3 4 6 7 8 9
Loop:
for i := 0; i < 10; i++ {
if i == 5 {
goto Loop
}
fmt.Println(i)
}
输出:
0 1 2 3 4 0 1 2 3 4 ...(无限)
对于 break
和 continue
,附加标签可让您指定要引用的循环。例如,您可能希望 break
/continue
外循环而不是嵌套的循环。
这是来自 Go Documentation 的示例:
RowLoop:
for y, row := range rows {
for x, data := range row {
if data == endOfRow {
continue RowLoop
}
row[x] = data + bias(x, y)
}
}
即使当前正在迭代行中的列(数据),这也能让您进入下一个“行”。这是有效的,因为标签 RowLoop
通过直接在外循环之前“标记”外循环。
break
可以以相同的方式使用相同的机制。这是 Go Documentation 中的一个示例,说明当 break
语句在 switch 语句内部时可用于跳出循环。如果没有标签,go 会认为你是在跳出 switch 语句,而不是循环(这就是你想要的,在这里)。
OuterLoop:
for i = 0; i < n; i++ {
for j = 0; j < m; j++ {
switch a[i][j] {
case nil:
state = Error
break OuterLoop
case item:
state = Found
break OuterLoop
}
}
}
对于goto
,这是比较传统的。它使程序执行 Label, next 处的命令。在您的示例中,这会导致无限循环,因为您会反复进入循环的开头。
文档时间
对于break
:
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.
对于continue
:
If there is a label, it must be that of an enclosing "for" statement, and that is the one whose execution advances.