引入
有时候正常的循环和函数流程不够用——想提前退出循环、跳过某次迭代、甚至跳到代码的某个位置。跳转语句就是干这个的。Go 提供了 break、continue、goto、return 四种跳转方式,加上标签(label)可以实现跨层跳转。
正文
定义
定义
跳转语句用于改变程序的正常执行流程,包括跳出循环、跳过当前迭代、跳转到指定位置或直接返回函数。Go 支持
break、continue、goto、return以及标签配合使用。
语法
// break:跳出当前循环或 switch
break
// continue:跳过本次迭代
continue
// goto:跳转到标签位置
goto LabelName
// return:从函数返回
return value
// 标签
LabelName:
// 代码例子
break 跳出循环
for i := 0; i < 10; i++ {
if i == 5 {
break // i 等于 5 时跳出
}
fmt.Println(i)
}
// 输出:0 1 2 3 4break 直接终止最近的循环或 switch,后面的迭代不再执行。
continue 跳过迭代
for i := 0; i < 10; i++ {
if i%2 == 0 {
continue // 跳过偶数
}
fmt.Println(i)
}
// 输出:1 3 5 7 9continue 跳过本次循环的剩余代码,直接进入下一次迭代。
return 返回值
func max(a, b int) int {
if a > b {
return a
}
return b
}
func greet() {
fmt.Println("Hello")
return // 无返回值的函数也可以用 return 提前结束
}return 结束函数执行,把值返回给调用者。可以在函数任意位置使用。
多返回值
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, fmt.Errorf("除数不能为 0")
}
return a / b, nil
}Go 函数可以返回多个值,常见模式是 (结果, error)。
goto 跳转
func main() {
i := 0
Start:
if i < 5 {
fmt.Println(i)
i++
goto Start
}
}
// 输出:0 1 2 3 4goto 跳转到同一函数内的标签位置。实际开发中很少用,用了会让代码难以阅读。
goto 的限制
func main() {
// goto End
// x := 10 // 错误:goto 不能跳过变量声明
goto End
fmt.Println("跳过")
End:
fmt.Println("到了")
}Go 的 goto 有限制:不能跳过变量声明语句,也不能跳到其他函数里。
标签配合 break/continue
在嵌套循环中,break 和 continue 默认只作用于最内层循环。用标签可以跳出多层:
outer:
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
if i == 1 && j == 1 {
break outer // 直接跳出外层循环
}
fmt.Printf("(%d,%d) ", i, j)
}
}
// 输出:(0,0) (0,1) (0,2) (1,0)continue 也能配合标签:
outer:
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
if j == 1 {
continue outer // 跳过外层当前迭代
}
fmt.Printf("(%d,%d) ", i, j)
}
}switch 中的 break
switch n {
case 1:
fmt.Println("一")
break // 可省略,Go 的 switch 自动 break
case 2:
fmt.Println("二")
}switch 自带 break,一般不需要手写。但在 select 语句里 break 有类似作用。
常见写法
| 写法 | 说明 |
|---|---|
break | 跳出最近的循环或 switch |
continue | 跳过本次迭代 |
return | 结束函数,返回值 |
return x, nil | 返回多个值 |
goto Label | 跳转到标签位置(慎用) |
break Label | 跳出指定标签的循环 |
continue Label | 继续指定标签的循环 |
特点
break和continue只能用在循环和 switch/select 里goto不能跳过变量声明,不能跨函数,实际项目里极少使用- 标签 +
break/continue是处理嵌套循环的利器 return可以在函数任意位置提前返回,不必等到函数末尾- Go 的
defer会在return之前执行,这个特性后面会学到 break在switch里可省略,但在for循环里不会自动 break
理解
跳转语句本质上是给程序流程加了”快捷键”。break 和 continue 是日常必备,处理循环逻辑几乎离不开。goto 在 Go 里被限制得很死,基本上不推荐用。return 则是最常用的,尤其是配合错误处理提前返回的模式(early return),在 Go 代码里到处都是。
引出
跳转语句里的 return 经常和错误处理配合使用——检查到错误就提前 return。接下来看 Go 错误处理,学学 Go 怎么用返回值来处理错误。