Golang 中支持函数式编程,主要通过高阶函数(函数作为参数或返回值)和闭包实现。
高阶函数例子:
// 函数作为参数
func add(x, y int) int {
return x + y
}
func do(f func(int, int) int, a, b int) int {
return f(a, b)
}
func main() {
sum := do(add, 1, 2) // sum = 3
println(sum)
}
闭包例子:
func makeAdder(x int) func(int) int {
return func(y int) int {
return x + y
}
}
func main() {
add5 := makeAdder(5) // 返回一个闭包
sum := add5(10) // sum = 15
println(sum)
}
makeAdder 返回一个闭包,该闭包可以访问并记住其封闭作用域(enclosing scope)中的变量 x。
每次调用 add5 都会使用封闭变量 x,所以该闭包可以作为一个函数达到累加的效果。
除此之外,Golang 还支持匿名函数和内置的高阶函数,都有助于函数式编程,例如:
- 匿名函数:
func(func(x int) int) {
return x + 1
}
- 内置的高阶函数:
1) len、cap、append: 对 slice 进行操作
2) make: 创建 slice、map 和 channel
3) delete: 从 map 中删除元素
4) panic 和 recover: 用于异常处理
所以 Golang 对函数式编程的支持主要体现在:
- 高阶函数:函数可以作为参数或返回值
- 闭包:函数可以访问并引用其封闭作用域的变量
- 内置的高阶函数和匿名函数
- 能轻松实现高阶函数的语法:省略类型申明、多值返回等
Golang 的这些特性使得函数式编程成为可能,我们可以通过这些手段来提高代码的抽象程度和重用性。