package main import "fmt" func exercise1() func(int) int { fmt.Println("=== 练习1:基础闭包 ===") // 创建一个闭包函数,它捕获外部变量multiplier // 该闭包接收一个int参数并返回乘以multiplier的结果 multiplier := 3 multifunc := func(num int) int { return multiplier * num } return multifunc } func exercise2() func() int { fmt.Println("=== 练习2:闭包状态保持 ===") // 创建一个递增计数器闭包 // 每次调用返回的函数时,计数器加1 // 提示:使用匿名函数捕获外部变量 count := 0 countfunc := func() int { count++ return count } return countfunc } func exercise3() func() int { fmt.Println("=== 练习3:斐波那契数列闭包 ===") // 创建一个生成斐波那契数列的闭包 // 每次调用返回下一个斐波那契数 // 数列: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34... a, b := 0, 1 fib := func() int { result := a a, b = b, a+b return result } return fib } func exercise4() func(int) bool { fmt.Println("=== 练习4:闭包配置 ===") // 创建一个检查数字是否在范围内的闭包生成器 // 该生成器接受min和max两个参数,返回一个检查函数 // 检查函数判断输入数字是否在[min, max]范围内 min := 10 max := 20 check := func(num int) bool { return num >= min && num <= max } return check } func exercise5(start int) func(int) int { fmt.Println("=== 练习5:闭包累加器 ===") // 创建一个累加器闭包 // 从start开始,每次调用累加参数值 // 提示:闭包应该能访问外部作用域的变量 total := start adder := func(n int) int { total += n return total } return adder } func main() { fmt.Println("=== 闭包 练习 ===") add3 := exercise1() fmt.Printf("练习1结果: add3(4) = %d\n", add3(4)) fmt.Printf("练习1结果: add3(5) = %d\n", add3(5)) counter := exercise2() fmt.Printf("练习2结果: counter() = %d\n", counter()) fmt.Printf("练习2结果: counter() = %d\n", counter()) fmt.Printf("练习2结果: counter() = %d\n", counter()) fib := exercise3() fmt.Printf("练习3结果: fib() = %d\n", fib()) fmt.Printf("练习3结果: fib() = %d\n", fib()) fmt.Printf("练习3结果: fib() = %d\n", fib()) fmt.Printf("练习3结果: fib() = %d\n", fib()) fmt.Printf("练习3结果: fib() = %d\n", fib()) inRange := exercise4() fmt.Printf("练习4结果: inRange(15) = %t\n", inRange(15)) fmt.Printf("练习4结果: inRange(5) = %t\n", inRange(5)) fmt.Printf("练习4结果: inRange(20) = %t\n", inRange(20)) accumulator := exercise5(100) fmt.Printf("练习5结果: accumulator(10) = %d\n", accumulator(10)) fmt.Printf("练习5结果: accumulator(20) = %d\n", accumulator(20)) fmt.Printf("练习5结果: accumulator(30) = %d\n", accumulator(30)) }