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