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