| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- 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()
- }
|