| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- package main
- import "fmt"
- func add(a, b int) int {
- return a + b
- }
- // 另一个函数也可以作为参数,op 的类型是 func(int, int) int。
- // 本课约定调用方必须传入非 nil 的 op。
- func calculate(a, b int, op func(int, int) int) int {
- return op(a, b)
- }
- // 返回值本身是函数。返回的匿名函数使用外层的 count,形成闭包。
- func newCounter() func() int {
- count := 0
- return func() int {
- count++
- return count
- }
- }
- // 对比 defer 的普通参数与闭包读取变量的时机。
- func showDefer() {
- value := 10
- defer fmt.Printf("普通参数:%d\n", value)
- defer func() {
- fmt.Printf("闭包读取变量:%d\n", value)
- }() // 这里的 () 表示调用;defer 把这次调用延后执行。
- value = 20
- fmt.Printf("函数主体:%d\n", value)
- }
- func main() {
- fmt.Println("=== 函数赋给变量 ===")
- operation := add // 不加括号是取得函数值,不是执行 add。
- fmt.Printf("通过变量调用:%d\n", operation(2, 3))
- fmt.Println("\n=== 匿名函数 ===")
- double := func(number int) int {
- return number * 2
- }
- fmt.Printf("匿名函数赋给变量:%d\n", double(4))
- func(name string) {
- fmt.Printf("立即调用:你好,%s\n", name)
- }("小朱")
- fmt.Println("\n=== 函数作为参数 ===")
- fmt.Printf("传入加法函数:%d\n", calculate(8, 3, add))
- result := calculate(8, 3, func(a, b int) int {
- return a - b
- })
- fmt.Printf("传入匿名减法函数:%d\n", result)
- fmt.Println("\n=== 闭包保存状态 ===")
- counter := newCounter()
- fmt.Printf("第一个计数器:%d\n", counter())
- fmt.Printf("第一个计数器:%d\n", counter())
- other := newCounter()
- fmt.Printf("独立计数器:%d\n", other())
- fmt.Printf("第一个计数器继续:%d\n", counter())
- fmt.Println("\n=== 闭包与 defer ===")
- showDefer()
- }
|