break只跳出最近一层循环而非函数,嵌套时需用带标签break;continue仅跳过本次迭代;for range中修改索引变量无效。
很多人误以为 break 会终止函数执行,其实它只作用于最近一层的 for、switch 或 select。在嵌套循环中,它不会影响外层循环。
常见错误现象:三层 for 嵌套,内层用了 break,结果只跳出最内层,外两层继续跑——这不是 bug,是设计如此。
break,比如 outer: for {... break outer}
break 后不能跟表达式,只接受可选的标签名switch 中,break 默认防止 fallthrough;不写也不会自动穿透,Go 的 switch 默认无穿透continue 的作用是跳过当前循环体剩余代码,直接进入下一次迭代判断。它常被用来过滤某些条件下的处理逻辑。
使用场景:遍历切片时跳过 nil 元素、跳过不符合权限的用户、跳过测试环境中的特定 ID。
continue 同样只作用于最近的 for 循环,不支持跨层switch 或 select 中单独使用 continue(语法错误)continue 前有变量自增(如 i++),而你把它写在循环体开头,可能导致跳过递增,引发死循环Go 的 for range 是值拷贝机制,修改循环变量(如 i 或 v)对迭代过程完全无影响。
错误写法示例:
for i := range slice {
if someCondition {
i++ // 这行毫无作用
continue
}
}
range 的每次迭代,i 都是新赋值的副本,改它不改变下一轮的索引for i := 0; i 形式,并手动控制 i
range 时,顺序不保证,也不受 continue 或 break 影响遍历“剩余键”的数量带标签的 break 和 continue 是唯一能跨层控制流程的方式,但标签位置和语法很严格。
典型错误:标签写在 { 后面、漏掉冒号、标签名和 break 不匹配。

Loop1: for {...}
break Loop1 和 continue Loop1 都合法,但 Loop1 必须是外层循环的标签名if 块引用type:、map:),编译报错break label,往往说明逻辑可以拆成函数或重构成状态机。最容易被忽略的是 for range 的不可变性——那里的 i 不是游标,只是快照。