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

练习题

  1. 编写一个函数,使用 switch 判断分数的等级(90以上A,80以上B,…​)。

  2. 使用 for 循环和 defer,打印 0 到 4 的数字。要求输出顺序为:先打印 "Start",然后输出数字,最后打印 "Done"。


相关阅读