Go 语言的流程控制简洁而强大。不同于其他语言提供多种循环和复杂的条件判断,Go 遵循"少即是多"的原则,仅通过 for、if、switch 和独特的 defer 就完成了所有逻辑构建。
1. 循环之王:for
在 Go 中,for 是唯一的循环语句 。它有几种不同的变体,涵盖了其他语言中 for 和 while 的所有功能。
基础语法
标准的 for 循环由三部分组成,且不需要括号:
Go
for i := 0; i < 10; i++ {
sum += i
}
-
初始化语句:执行前运行(通常是短变量声明)。
-
条件表达式:每次迭代前求值。
-
后置语句:每次迭代后运行。
变体:Go 的 "while"
你可以省略初始化和后置语句,这时它就变成了其他语言中的 while:
Go
sum := 1
for sum < 1000 {
sum += sum
}
无限循环
如果省略循环条件,它就是死循环:
Go
for {
// 除非 break 或 return,否则永远运行
}
2. 条件判断:if 与 else
Go 的 if 语句与 for 类似:表达式不需要括号,但大括号 {} 是必须的。
带有简短语句的 if
这是一个非常实用的特性:你可以在条件表达式前执行一段简短的语句。该语句声明的变量作用域仅限于 if 及对应的 else 块内。
Go
if v := math.Pow(x, n); v < lim {
return v
} else {
fmt.Printf("%g >= %g\n", v, lim)
}
// 这里无法使用变量 v
3. 分支选择:switch
Go 的 switch 比 C 或 Java 更灵活,也更安全。
-
自动 break :除非以
fallthrough语句结尾,否则代码执行完选中的case后会自动终止,不需要显式写break。 -
任意值 :
case的值不局限于整数或常量。 -
无条件 switch :如果省略 switch 后的表达式,它等同于
switch true,可以作为更整洁的if-then-else链使用。
Go
switch os := runtime.GOOS; os {
case "darwin":
fmt.Println("OS X.")
case "linux":
fmt.Println("Linux.")
default:
fmt.Printf("%s.\n", os)
}
4. 延迟执行:defer
defer 是 Go 的一大特色。它会将函数的执行推迟到外层函数返回(return)之后立即执行。
基本用法
常用于关闭文件句柄、解锁资源等清理工作:
Go
func main() {
defer fmt.Println("world")
fmt.Println("hello")
}
// 输出顺序:hello -> world
延迟栈(Stacking defers)
如果你在一个函数内多次调用 defer,它们会按照**后进先出(LIFO)**的顺序执行。
Go
for i := 0; i < 3; i++ {
defer fmt.Print(i)
}
// 输出结果为:2 1 0
📝 总结表
| 关键字 | 核心要点 | 视觉提醒 |
|---|---|---|
for |
Go 唯一的循环,涵盖 for/while/forever | 🔁 |
if |
支持在判断前声明变量,大括号必选 | ❓ |
switch |
默认自动 break,case 可以是任何表达式 | 🎋 |
defer |
延迟执行,常用于资源释放,遵循 LIFO 栈顺序 | ⚓ |