go 中的函数闭包允许在函数内部声明的函数访问父函数作用域中的变量,即使父函数已经退出。这使得 go 可以在特定场景下发挥以下作用:创建具有持久行为的函数,即使父函数退出后依然可以访问其变量。通过将函数作为参数传递,实现动态行为和松散耦合。实现匿名函数,在需要时执行特定操作而不声明单独的函数。
Go 中的函数闭包
介绍
闭包是在函数内部声明的函数,它可以访问其父函数作用域中的变量。这使得您可以创建具有持久行为的函数,即使父函数已经退出。
语法
立即学习“go语言免费学习笔记(深入)”;
点击下载“修复打印机驱动工具”;
func outerFunction(x int) func() int {
// 定义闭包函数
return func() int {
return x
}
}
上面示例中,outerFunction 返回一个闭包函数,该函数可以访问 x 变量,即使 outerFunction 已经退出。
实战案例
统计累计值
package main
import "fmt"
func main() {
var count int // 定义计数器
// 定义一个闭包函数来增加计数器
increment := func() {
count++
}
// 调用闭包函数多次
increment()
increment()
// 打印计数器值
fmt.Println(count) // 输出 2
}
在这个示例中,闭包函数 increment 可以访问并修改父函数 (main) 中的 count 变量,即使 main 函数已经退出。
使用闭包进行缓存
package main
import "fmt"
func main() {
// 定义一个缓存函数,返回计算结果
cache := func(fn func(int) int) func(int) int {
cache := make(map[int]int)
// 返回一个闭包函数来检查缓存或计算结果
return func(n int) int {
if value, ok := cache[n]; ok {
return value
}
value = fn(n)
cache[n] = value
return value
}
}
// 定义一个要缓存的函数
fibonacci := func(n int) int {
if n < 2 {
return 1
}
return fibonacci(n-1) + fibonacci(n-2)
}
// 使用闭包缓存斐波那契数列的计算结果
cachedFibonacci := cache(fibonacci)
// 调用闭包函数打印斐波那契数列的前 10 项
for i := 0; i < 10; i++ {
fmt.Println(cachedFibonacci(i))
}
// 输出:
// 1
// 1
// 2
// 3
// 5
// 8
// 13
// 21
// 34
// 55
}
在这个示例中,闭包函数 cache 创建了一个缓存机制,用于存储计算结果。当使用闭包函数 cachedFibonacci 计算斐波那契数时,它会检查缓存中是否存在结果,如果没有,它将通过调用原始函数 fibonacci 进行计算并将其存储在缓存中。通过使用闭包,我们可以持久地存储计算结果,从而提高应用程序的性能。