Go 语言的控制结构非常精简。它没有 whiledo-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 优雅解决资源释放问题,让代码逻辑更加线性和清晰。

练习题

  1. 编写一个函数,使用 switch 判断分数的等级(90以上A,80以上B,…)。
  2. 使用 for 循环和 defer,打印 0 到 4 的数字。要求输出顺序为:先打印 “Start”,然后输出数字,最后打印 “Done”。

相关阅读