深入浅出 Go 流程控制:从循环到延迟执行

Go 语言的流程控制简洁而强大。不同于其他语言提供多种循环和复杂的条件判断,Go 遵循"少即是多"的原则,仅通过 forifswitch 和独特的 defer 就完成了所有逻辑构建。


1. 循环之王:for

在 Go 中,for 是唯一的循环语句 。它有几种不同的变体,涵盖了其他语言中 forwhile 的所有功能。

基础语法

标准的 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. 条件判断:ifelse

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 栈顺序
相关推荐
DICOM医学影像几秒前
4. go语言从零实现以太坊客户端 - 区块链转账
golang·区块链·以太坊·web3.0·geth
人道领域几秒前
【零基础学java】(等待唤醒机制,线程池补充)
java·开发语言·jvm
智算菩萨4 分钟前
【Python自然语言处理】基于NLTK库的英文文本词频统计系统实现原理及应用
开发语言·python·自然语言处理
天天进步20156 分钟前
KrillinAI 源码级深度拆解三:声音的克隆与新生——解析 KrillinAI 接入 GPT-SoVITS/CosyVoice 的配音逻辑
golang
superman超哥7 分钟前
Rust 异步并发核心:tokio::spawn 与任务派发机制深度解析
开发语言·rust·编程语言·rust异步并发核心·rust任务派发机制
喵星人工作室7 分钟前
C++传说:神明之剑0.2.1
开发语言·c++·游戏
黎雁·泠崖8 分钟前
Java入门之吃透基础语法:注释+关键字+字面量+变量全解析
java·开发语言·intellij-idea·intellij idea
短剑重铸之日9 分钟前
《7天学会Redis》Day 1 - Redis核心架构与线程模型
java·redis·后端·架构·i/o多路复用·7天学会redis
努力的小郑9 分钟前
Spring 的西西弗斯之石:理解 BeanFactory、FactoryBean 与 ObjectFactory
后端·spring·面试
华仔啊10 分钟前
Java 异步调用失败导致系统崩溃?这份重试机制救了我
java·后端