使用匿名函数作为回调函数
匿名函数也可以用作回调函数,这意味着我们可以将它们作为参数传递给其他函数。当你希望在不创建命名函数的情况下自定义函数行为时,这非常有用。
什么是回调函数?
回调函数是作为参数传递给另一个函数并在第一个函数完成任务后执行的函数。这允许调用者自定义被调用函数的行为,提供更大的灵活性和模块化。本质上,接收回调的函数会在某个时刻“回调”该回调函数。
为什么使用匿名函数作为回调?
匿名函数非常适合用作回调函数,因为它们通常表示仅在特定上下文中使用的简短、特定的行为。使用匿名函数作为回调可以使代码更加简洁,并避免定义单独的命名函数。
将 anonymous.go
替换为以下代码:
package main
import (
"fmt"
"math"
)
// 'visit' 接受一个切片和一个函数。它将函数应用于切片中的每个元素。
func visit(lst []float64, f func(float64)) {
for _, value := range lst {
f(value)
}
}
func main() {
arr := []float64{1, 2, 3, 4, 5, 6, 7, 8, 9}
// 使用匿名函数将每个元素与其自身相加
visit(arr, func(v float64) {
fmt.Printf("Sum:%.0f ", v+v)
})
fmt.Println()
// 使用匿名函数将每个元素与其自身相乘
visit(arr, func(v float64) {
fmt.Printf("Product:%.0f ", v*v)
})
fmt.Println()
// 使用匿名函数通过 math.Pow 对每个元素进行平方
visit(arr, func(v float64) {
v = math.Pow(v, 2)
fmt.Printf("Square:%.0f ", v)
})
fmt.Println()
}
运行程序:
go run anonymous.go
预期输出:
Sum:2 Sum:4 Sum:6 Sum:8 Sum:10 Sum:12 Sum:14 Sum:16 Sum:18
Product:1 Product:4 Product:9 Product:16 Product:25 Product:36 Product:49 Product:64 Product:81
Square:1 Square:4 Square:9 Square:16 Square:25 Square:36 Square:49 Square:64 Square:81
在这个程序中,我们首先创建了一个 visit
函数,它接受一个 float64
类型的切片 (lst
) 和一个类型为 func(float64)
的函数 (f
)。visit
函数遍历切片,并为每个元素调用提供的函数 f
。这种设计模式使 visit
函数能够根据提供的回调函数 f
执行不同的逻辑。
在 main
函数中,我们使用不同的匿名函数调用了 visit
三次,以演示回调如何提供灵活性。
- 第一个匿名函数计算每个元素与其自身的和。
- 第二个匿名函数计算每个元素与其自身的乘积。
- 第三个匿名函数使用
math.Pow
对每个元素进行平方。
这展示了如何将匿名函数作为回调传递,以及 visit
函数如何根据作为参数传递的回调函数执行不同的操作。这使得你的代码更具可重用性和模块化。