引入

有时候正常的循环和函数流程不够用——想提前退出循环、跳过某次迭代、甚至跳到代码的某个位置。跳转语句就是干这个的。Go 提供了 breakcontinuegotoreturn 四种跳转方式,加上标签(label)可以实现跨层跳转。

正文

定义

定义

跳转语句用于改变程序的正常执行流程,包括跳出循环、跳过当前迭代、跳转到指定位置或直接返回函数。Go 支持 breakcontinuegotoreturn 以及标签配合使用。

语法

// 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 4

break 直接终止最近的循环或 switch,后面的迭代不再执行。

continue 跳过迭代

for i := 0; i < 10; i++ {
    if i%2 == 0 {
        continue  // 跳过偶数
    }
    fmt.Println(i)
}
// 输出:1 3 5 7 9

continue 跳过本次循环的剩余代码,直接进入下一次迭代。

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 4

goto 跳转到同一函数内的标签位置。实际开发中很少用,用了会让代码难以阅读。

goto 的限制

func main() {
    // goto End
    // x := 10  // 错误:goto 不能跳过变量声明
 
    goto End
    fmt.Println("跳过")
 
End:
    fmt.Println("到了")
}

Go 的 goto 有限制:不能跳过变量声明语句,也不能跳到其他函数里。

标签配合 break/continue

在嵌套循环中,breakcontinue 默认只作用于最内层循环。用标签可以跳出多层:

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继续指定标签的循环

特点

  • breakcontinue 只能用在循环和 switch/select 里
  • goto 不能跳过变量声明,不能跨函数,实际项目里极少使用
  • 标签 + break/continue 是处理嵌套循环的利器
  • return 可以在函数任意位置提前返回,不必等到函数末尾
  • Go 的 defer 会在 return 之前执行,这个特性后面会学到
  • breakswitch 里可省略,但在 for 循环里不会自动 break

理解

跳转语句本质上是给程序流程加了”快捷键”。breakcontinue 是日常必备,处理循环逻辑几乎离不开。goto 在 Go 里被限制得很死,基本上不推荐用。return 则是最常用的,尤其是配合错误处理提前返回的模式(early return),在 Go 代码里到处都是。

引出

跳转语句里的 return 经常和错误处理配合使用——检查到错误就提前 return。接下来看 Go 错误处理,学学 Go 怎么用返回值来处理错误。