Go跳转语句break和continue
Go break和continue控制循环执行流程,配合标签可跳出多层循环。
break语句
退出循环
Go
for i := 0; i < 10; i++ {
if i == 5 {
break // 退出循环
}
fmt.Println(i)
}
// 输出:0, 1, 2, 3, 4
退出switch
Go
// switch中break可选(默认有)
switch n {
case 1:
fmt.Println("1")
break // 可省略,自动break
case 2:
fmt.Println("2")
}
continue语句
跳过当前迭代
Go
for i := 0; i < 10; i++ {
if i % 2 == 0 {
continue // 跳过偶数
}
fmt.Println(i)
}
// 输出:1, 3, 5, 7, 9
继续下一次迭代
Go
nums := []int{1, 2, 3, -1, 4, 5}
for _, n := range nums {
if n < 0 {
continue // 跳过负数
}
process(n) // 只处理正数
}
标签配合break
跳出外层循环
Go
outer:
for i := 0; i < 5; i++ {
for j := 0; j < 5; j++ {
if i == 2 && j == 2 {
break outer // 跳出外层循环
}
fmt.Println(i, j)
}
}
// 当i=2, j=2时,直接跳出所有循环
查找示例
Go
found := false
search:
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if data[i][j] == target {
found = true
break search // 找到后退出所有循环
}
}
}
标签配合continue
跳到外层循环下一次
Go
outer:
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
if j == 1 {
continue outer // 跳到i的下一个值
}
fmt.Println(i, j)
}
}
// 输出:(0,0) (1,0) (2,0)
// j=1时跳到外层i的下一次
break vs continue对比
| 语句 | 作用 | 执行后 |
|---|---|---|
| break | 退出循环 | 循环结束 |
| continue | 跳过本次 | 继续下一次 |
| break label | 退出多层 | 跳出标签循环 |
| continue label | 跳到外层 | 外层下一次 |
标签规则
定义标签
Go
labelName:
for ... {
// 循环体
}
// 标签必须在循环或switch前
// 标签名可以是任意标识符
使用标签
Go
myLoop:
for i := 0; i < 10; i++ {
if condition {
break myLoop // 退出标签指定的循环
continue myLoop // 跳到标签循环下一次
}
}
goto语句
goto跳转(不推荐)
Go
// goto跳转到标签(不推荐使用)
i := 0
loop:
fmt.Println(i)
i++
if i < 5 {
goto loop // 跳到loop标签
}
goto易导致代码混乱,尽量避免使用。
goto vs break/continue
Go
// break/continue:结构化跳转,推荐
for i := 0; i < 10; i++ {
if i == 5 {
break // 清晰退出
}
}
// goto:任意跳转,不推荐
i := 0
loop:
if i < 10 {
i++
goto loop // 跳转混乱
}
使用示例
Go
func findTarget(matrix [][]int, target int) bool {
found := false
search:
for i := 0; i < len(matrix); i++ {
for j := 0; j < len(matrix[i]); j++ {
if matrix[i][j] == target {
found = true
break search // 找到即退出
}
}
}
return found
}
func filter(nums []int) []int {
result := []int{}
for _, n := range nums {
if n < 0 {
continue // 跳过负数
}
result = append(result, n)
}
return result
}
要点总结
- break退出整个循环
- continue跳过当前迭代,继续下一次
- 标签配合break跳出多层循环
- 标签配合continue跳到外层下一次
- 标签定义在循环前:labelName:
- switch中break可选(默认自动break)
- goto不推荐使用,易造成代码混乱
- break/continue是结构化跳转,推荐使用
📝 发现内容有误?点击此处直接编辑