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语言免费学习笔记(深入)”;
把函数作为参数:实现高阶函数
高阶函数是指接受函数作为参数、或返回函数的函数。Go 中最典型的例子是自定义的通用处理逻辑。
示例:一个对两个数执行任意运算的函数:
func calculate(a, b int, op Processor) int {return op(a, b)
}
调用时可以传入具体函数:
add := func(x, y int) int { return x + y }result := calculate(3, 5, add) // 得到 8
也可以直接传匿名函数:
result := calculate(10, 4, func(x, y int) int { return x * y }) // 得到 40回调函数:在操作完成后触发自定义行为
回调本质就是把函数作为参数传入,在某个时机(比如任务完成、错误发生、遍历到某项)由被调用方执行它。
常见场景:遍历切片并允许用户决定如何处理每个元素。
type Handler func(item string)func forEach(items []string, handle Handler) {
for _, item := range items {
handle(item)
}
}
使用方式:
names := []string{"Alice", "Bob", "Charlie"}forEach(names, func(name string) {
fmt.Println("Hello,", name)
})
输出:
Hello, AliceHello, Bob
Hello, Charlie
实际应用建议与注意点
- 函数类型名建议语义清晰,比如
Validator、Mapper、ErrorHandler,便于理解用途 - 避免在函数参数中写过长的匿名函数;复杂逻辑建议提前定义命名函数,提升可读性和可测试性
- 函数值可以捕获外部变量(闭包),但要注意变量生命周期 —— 如果返回的函数在原作用域结束后仍被调用,需确保捕获的变量仍有效
- 函数类型不支持比较(除了与
nil比较),也不能用作 map 的 key










