main.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package main
  2. import "fmt"
  3. // defer 在当前函数即将返回时执行,而不是整个程序结束时才执行。
  4. func showOrder() {
  5. fmt.Println("进入 showOrder")
  6. defer fmt.Println("延迟操作 A:最后执行")
  7. defer fmt.Println("延迟操作 B:先于 A 执行")
  8. fmt.Println("执行函数主体")
  9. }
  10. // 即使提前 return,之前已经登记的 defer 也会执行。
  11. func checkScore(score int) error {
  12. defer fmt.Println("checkScore:本次检查结束")
  13. if score < 0 || score > 100 {
  14. return fmt.Errorf("成绩 %d 无效", score)
  15. }
  16. fmt.Printf("成绩 %d 有效\n", score)
  17. return nil
  18. }
  19. // defer 调用的参数在登记时求值,不是等到返回时才读取变量。
  20. func showArgument() {
  21. value := 10
  22. defer fmt.Printf("defer 使用登记时的参数:%d\n", value)
  23. value = 20
  24. fmt.Printf("主体中修改后的变量:%d\n", value)
  25. }
  26. func main() {
  27. // 1. 根据一个值选择分支,不像 C 那样默认贯穿到后面的 case。
  28. fmt.Println("=== 按值选择 ===")
  29. command := "run"
  30. switch command {
  31. case "build":
  32. fmt.Println("选择:编译程序")
  33. case "run":
  34. fmt.Println("选择:编译并运行程序")
  35. case "test":
  36. fmt.Println("选择:运行测试")
  37. default:
  38. fmt.Println("未知指令")
  39. }
  40. // 2. 同一个 case 可以列出多个值。
  41. fmt.Println("\n=== 多个值共用分支 ===")
  42. day := 6
  43. switch day {
  44. case 1, 2, 3, 4, 5:
  45. fmt.Println("工作日")
  46. case 6, 7:
  47. fmt.Println("周末")
  48. default:
  49. fmt.Println("星期数无效")
  50. }
  51. // 3. 不写 switch 表达式,每个 case 写布尔条件。
  52. // 从上到下判断,只执行第一个成立的分支。
  53. fmt.Println("\n=== 按条件选择 ===")
  54. score := 85
  55. switch {
  56. case score < 0 || score > 100:
  57. fmt.Println("成绩无效")
  58. case score >= 90:
  59. fmt.Println("等级:优秀")
  60. case score >= 80:
  61. fmt.Println("等级:良好")
  62. case score >= 60:
  63. fmt.Println("等级:及格")
  64. default:
  65. fmt.Println("等级:不及格")
  66. }
  67. fmt.Println("\n=== defer 执行顺序 ===")
  68. showOrder()
  69. fmt.Println("showOrder 已返回 main")
  70. fmt.Println("\n=== 提前返回也执行 defer ===")
  71. err := checkScore(120)
  72. if err != nil {
  73. fmt.Println("调用方收到错误:", err)
  74. }
  75. fmt.Println("\n=== defer 参数求值时机 ===")
  76. showArgument()
  77. }