Go 语言的控制结构非常精简。它没有 while 或 do-while,只有一个强大的 for 循环。同时,switch 更加智能,if 支持初始化语句。本章还将介绍 Go 独有的资源管理神器 —— defer。
示例代码
package main
import "fmt"
func main() {
// 1. if 语句
x := 10
// 条件判断不需要小括号 ()
if x > 5 {
fmt.Println("x is large")
}
// if 支持初始化语句:先执行初始化,再判断
if y := x * 2; y > 15 {
fmt.Println("y is", y) // y 的作用域仅限于 if 块
}
// 2. switch 语句
day := "Mon"
switch day {
case "Mon":
fmt.Println("Start of week")
// Go 默认不需要 break,自动终止
case "Fri":
fmt.Println("Weekend is coming")
default:
fmt.Println("Other day")
}
// 3. for 循环:Go 唯一的循环结构
// 形式一:类似于 C/Java 的 for
for i := 0; i < 3; i++ {
fmt.Print(i, " ")
}
fmt.Println()
// 形式二:类似于 while
count := 3
for count > 0 {
fmt.Print(count, " ")
count--
}
fmt.Println()
// 4. defer 延迟执行
// 常用于资源释放,函数返回前才会执行
defer fmt.Println("Exiting main function...")
fmt.Println("Doing some work...")
}关键点解释
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"。