Go支持将函数作为值传递,需先定义函数类型(如type Processor func(int, int) int),再用于参数或返回值;可实现高阶函数(如calculate)和回调(如forEach),但函数类型不可比较、不可作map键,且匿名函数不宜过长。
Go 语言本身不支持“函数类型作为参数”的语法糖(如 JavaScript 那样直接传匿名函数),但它完全支持将函数作为值传递——只要类型匹配,就可以把函数当作参数传给另一个函数,这就是 Go 中实现高阶函数和回调的核心方式。
在 Go 中,必须先定义一个函数类型,才能把它用作参数或返回值。函数类型声明了参数列表和返回值类型,是类型系统的一部分。
例如:
type Processor func(int, int) int这定义了一个叫 Processor 的类型,它代表“接受两个 int,返回一个 int”的函数。之后你就可以用 Processor 声明变量、参数或字段。
高阶函数是指接受函数作为参数、或返回函数的函数。Go 中最典型的例子是自定义的通用处理逻辑。
示例:一个对两个数执行任意运算的函数:
func calculate(a, b int, op Processor) int {调用时可以传入具体函数:
add := func(x, y int) int { return x + y }也可以直接传匿名函数:
result := calculate(10, 4, func(x, y int) int { return x * y }) // 得到 40回调本质就是把函数作为参数传入,在某个时机(比如任务完成、错误发生、遍历到某项)由被调用方执行它。
常见场景:遍历切片并允许用户决定如何处理每个元素。
type Handler func(item string)使用方式:
names := []string{"Alice", "Bob", "Charlie"}输出:
Hello, AliceValidator、Mapper、ErrorHandler,便于理解用途nil 比较),也不能用作 map 的 key