main.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package main
  2. import "fmt"
  3. func add(a, b int) int {
  4. return a + b
  5. }
  6. // 另一个函数也可以作为参数,op 的类型是 func(int, int) int。
  7. // 本课约定调用方必须传入非 nil 的 op。
  8. func calculate(a, b int, op func(int, int) int) int {
  9. return op(a, b)
  10. }
  11. // 返回值本身是函数。返回的匿名函数使用外层的 count,形成闭包。
  12. func newCounter() func() int {
  13. count := 0
  14. return func() int {
  15. count++
  16. return count
  17. }
  18. }
  19. // 对比 defer 的普通参数与闭包读取变量的时机。
  20. func showDefer() {
  21. value := 10
  22. defer fmt.Printf("普通参数:%d\n", value)
  23. defer func() {
  24. fmt.Printf("闭包读取变量:%d\n", value)
  25. }() // 这里的 () 表示调用;defer 把这次调用延后执行。
  26. value = 20
  27. fmt.Printf("函数主体:%d\n", value)
  28. }
  29. func main() {
  30. fmt.Println("=== 函数赋给变量 ===")
  31. operation := add // 不加括号是取得函数值,不是执行 add。
  32. fmt.Printf("通过变量调用:%d\n", operation(2, 3))
  33. fmt.Println("\n=== 匿名函数 ===")
  34. double := func(number int) int {
  35. return number * 2
  36. }
  37. fmt.Printf("匿名函数赋给变量:%d\n", double(4))
  38. func(name string) {
  39. fmt.Printf("立即调用:你好,%s\n", name)
  40. }("小朱")
  41. fmt.Println("\n=== 函数作为参数 ===")
  42. fmt.Printf("传入加法函数:%d\n", calculate(8, 3, add))
  43. result := calculate(8, 3, func(a, b int) int {
  44. return a - b
  45. })
  46. fmt.Printf("传入匿名减法函数:%d\n", result)
  47. fmt.Println("\n=== 闭包保存状态 ===")
  48. counter := newCounter()
  49. fmt.Printf("第一个计数器:%d\n", counter())
  50. fmt.Printf("第一个计数器:%d\n", counter())
  51. other := newCounter()
  52. fmt.Printf("独立计数器:%d\n", other())
  53. fmt.Printf("第一个计数器继续:%d\n", counter())
  54. fmt.Println("\n=== 闭包与 defer ===")
  55. showDefer()
  56. }