package main import "fmt" // defer 在当前函数即将返回时执行,而不是整个程序结束时才执行。 func showOrder() { fmt.Println("进入 showOrder") defer fmt.Println("延迟操作 A:最后执行") defer fmt.Println("延迟操作 B:先于 A 执行") fmt.Println("执行函数主体") } // 即使提前 return,之前已经登记的 defer 也会执行。 func checkScore(score int) error { defer fmt.Println("checkScore:本次检查结束") if score < 0 || score > 100 { return fmt.Errorf("成绩 %d 无效", score) } fmt.Printf("成绩 %d 有效\n", score) return nil } // defer 调用的参数在登记时求值,不是等到返回时才读取变量。 func showArgument() { value := 10 defer fmt.Printf("defer 使用登记时的参数:%d\n", value) value = 20 fmt.Printf("主体中修改后的变量:%d\n", value) } func main() { // 1. 根据一个值选择分支,不像 C 那样默认贯穿到后面的 case。 fmt.Println("=== 按值选择 ===") command := "run" switch command { case "build": fmt.Println("选择:编译程序") case "run": fmt.Println("选择:编译并运行程序") case "test": fmt.Println("选择:运行测试") default: fmt.Println("未知指令") } // 2. 同一个 case 可以列出多个值。 fmt.Println("\n=== 多个值共用分支 ===") day := 6 switch day { case 1, 2, 3, 4, 5: fmt.Println("工作日") case 6, 7: fmt.Println("周末") default: fmt.Println("星期数无效") } // 3. 不写 switch 表达式,每个 case 写布尔条件。 // 从上到下判断,只执行第一个成立的分支。 fmt.Println("\n=== 按条件选择 ===") score := 85 switch { case score < 0 || score > 100: fmt.Println("成绩无效") case score >= 90: fmt.Println("等级:优秀") case score >= 80: fmt.Println("等级:良好") case score >= 60: fmt.Println("等级:及格") default: fmt.Println("等级:不及格") } fmt.Println("\n=== defer 执行顺序 ===") showOrder() fmt.Println("showOrder 已返回 main") fmt.Println("\n=== 提前返回也执行 defer ===") err := checkScore(120) if err != nil { fmt.Println("调用方收到错误:", err) } fmt.Println("\n=== defer 参数求值时机 ===") showArgument() }