break只跳出最近一层循环而非函数,嵌套时需用带标签break;continue仅跳过本次迭代;for range中修改索引变量无效。

break 会直接跳出当前循环,不是整个函数
很多人误以为 break 会终止函数执行,其实它只作用于最近一层的 for、switch 或 select。在嵌套循环中,它不会影响外层循环。
常见错误现象:三层 for 嵌套,内层用了 break,结果只跳出最内层,外两层继续跑——这不是 bug,是设计如此。
- 如果要跳出多层循环,得用带标签的
break,比如outer: for {... break outer} -
break后不能跟表达式,只接受可选的标签名 - 在
switch中,break默认防止 fallthrough;不写也不会自动穿透,Go 的switch默认无穿透
continue 只跳过本次迭代,不退出循环
continue 的作用是跳过当前循环体剩余代码,直接进入下一次迭代判断。它常被用来过滤某些条件下的处理逻辑。
使用场景:遍历切片时跳过 nil 元素、跳过不符合权限的用户、跳过测试环境中的特定 ID。
立即学习“go语言免费学习笔记(深入)”;
-
continue同样只作用于最近的for循环,不支持跨层 - 不能在
switch或select中单独使用continue(语法错误) - 注意副作用:如果
continue前有变量自增(如i++),而你把它写在循环体开头,可能导致跳过递增,引发死循环
for range 中修改索引变量不影响循环次数
Go 的 for range 是值拷贝机制,修改循环变量(如 i 或 v)对迭代过程完全无影响。
错误写法示例:
for i := range slice {
if someCondition {
i++ // 这行毫无作用
continue
}
}
-
range的每次迭代,i都是新赋值的副本,改它不改变下一轮的索引 - 真要跳过多个元素,得用传统
for i := 0; i 形式,并手动控制i - 对 map 做
range时,顺序不保证,也不受continue或break影响遍历“剩余键”的数量
嵌套循环中标签的写法和易错点
带标签的 break 和 continue 是唯一能跨层控制流程的方式,但标签位置和语法很严格。
典型错误:标签写在 { 后面、漏掉冒号、标签名和 break 不匹配。
- 标签必须紧挨着循环语句前,且以冒号结尾:
Loop1: for {...} -
break Loop1和continue Loop1都合法,但Loop1必须是外层循环的标签名 - 标签作用域仅限于其后紧跟的语句块,不能跨函数或跨
if块引用 - 别用关键字或内置类型名当标签(如
type:、map:),编译报错
break label,往往说明逻辑可以拆成函数或重构成状态机。最容易被忽略的是 for range 的不可变性——那里的 i 不是游标,只是快照。










