Go 语言的控制结构非常精简。它没有 while 或 do-while,只有一个强大的 for 循环。同时,switch 更加智能,if 支持初始化语句。本章还将介绍 Go 独有的资源管理神器 —— defer。
示例代码
1package main
2
3import "fmt"
4
5func main() {
6 // 1. if 语句
7 x := 10
8 // 条件判断不需要小括号 ()
9 if x > 5 {
10 fmt.Println("x is large")
11 }
12
13 // if 支持初始化语句:先执行初始化,再判断
14 if y := x * 2; y > 15 {
15 fmt.Println("y is", y) // y 的作用域仅限于 if 块
16 }
17
18 // 2. switch 语句
19 day := "Mon"
20 switch day {
21 case "Mon":
22 fmt.Println("Start of week")
23 // Go 默认不需要 break,自动终止
24 case "Fri":
25 fmt.Println("Weekend is coming")
26 default:
27 fmt.Println("Other day")
28 }
29
30 // 3. for 循环:Go 唯一的循环结构
31 // 形式一:类似于 C/Java 的 for
32 for i := 0; i < 3; i++ {
33 fmt.Print(i, " ")
34 }
35 fmt.Println()
36
37 // 形式二:类似于 while
38 count := 3
39 for count > 0 {
40 fmt.Print(count, " ")
41 count--
42 }
43 fmt.Println()
44
45 // 4. defer 延迟执行
46 // 常用于资源释放,函数返回前才会执行
47 defer fmt.Println("Exiting main function...")
48 fmt.Println("Doing some work...")
49}
关键点解释
If 条件
- 条件表达式 不需要 小括号
()。 - 大括号
{}是 必须 的,且左大括号不能换行。 - 支持
if statement; condition写法,常用于处理错误:if err := doSomething(); err != nil { ... }。
Switch 分支
- 默认不需要
break,匹配到一个 case 后自动停止。 - 如果想继续执行下一个 case,需要显式使用
fallthrough(极少用)。 switch后可以没有表达式,直接在case中写条件判断,替代复杂的if-else链。
For 循环
Go 只有 for。
for init; condition; post {}:标准循环。for condition {}:相当于while。for {}:相当于while(true)死循环。- 配合
range关键字可以遍历数组、切片、Map 和通道。
Defer 延迟执行
defer后的函数会在当前函数 返回前 执行。- 多个
defer按照 后进先出 (LIFO) 的顺序执行(像栈一样)。 - 典型场景:关闭文件句柄、释放锁、数据库连接归还。
小结
Go 控制结构的设计哲学是“少即是多”。一个 for 搞定所有循环,defer 优雅解决资源释放问题,让代码逻辑更加线性和清晰。
练习题
- 编写一个函数,使用
switch判断分数的等级(90以上A,80以上B,…)。 - 使用
for循环和defer,打印 0 到 4 的数字。要求输出顺序为:先打印 “Start”,然后输出数字,最后打印 “Done”。