控制流
if
条件无括号;可带短变量声明,作用域限于 if 与 else:
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.22,for 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 组合可实现超时、取消等模式。