Skip to content
On this page

控制流

if

条件无括号;可带短变量声明,作用域限于 ifelse

go
if err := do(); err != nil {
    return err
}

for

Go 只有 for,无 while。三种常见形式:

go
for i := 0; i < n; i++ { }
for cond { }            // 等价 while
for { }                 // 死循环,靠 break 退出

遍历切片/字符串/映射/通道:for k, v := range x。若只要索引或只要值,用 _ 忽略。

Go 1.22 起:每轮循环变量

Go 1.22for range 与三段式 for 中声明的循环变量每轮迭代有独立实例,闭包捕获行为与旧版本不同;旧代码曾依赖「共享一个变量」的 bug 模式需审查。

switch

  • 表达式可选;无表达式时等价 switch true,可替代长 if-else
  • 无自动贯穿,需 fallthrough 才进入下一分支。
  • case 可为逗号分隔的多值。

break / continue 与标签

可带标签跳出外层 for/switch/select

go
Outer:
    for i := 0; i < 3; i++ {
        for j := 0; j < 3; j++ {
            break Outer
        }
    }

defer

  • 当前函数返回前(含 panic 路径)以 LIFO 执行。
  • 延迟调用的参数在 defer 语句执行时即求值,不是返回时求值。
  • 在循环内滥用 defer 会堆积到函数结束才执行,长循环中应改为普通调用或提取函数。
go
func f() {
    defer fmt.Println("second")
    defer fmt.Println("first")
}
// 打印 first 再 second

goto

存在但应极少使用;不能跳入变量声明作用域等限制见规范。

select

专用于通道:随机选择一个可执行的 case;若均可执行则伪随机;若均阻塞且无 default 则阻塞。与 for 组合可实现超时、取消等模式。

技术文库