Golang中的函数式编程有这么几个特点
- 函数是一等公民:参数,变量,返回值都可以是函数
- 高阶函数,函数的参数,返回值也是函数
- 函数 -> 闭包
正统的函数式编程
- 不可变性:不能有状态,只能有常量和函数
- 函数只能有一个参数
func adder() func(int) int {
sum := 0
// v是一个局部变量
return func(v int) int {
// sum是一个自由变量
sum += v
return sum
}
}
func main() {
a := adder()
for i := 0; i < 10; i++ {
fmt.Printf("0 + 1 + ... + %d = %d\n",
i, a(i))
}
}
函数返回的时候返回的并不是一个func函数体,而是返回了上图所示的一个闭包,闭包中的自由变量是会一直被记录下来,这样就实现了一个函数与其相关的引用环境的一个整体,可以在使用函数的时候将其引用的变量记录下来,但是也存在一个问题就是如果使用的多了就会很占内存,因为gc管不到之类,不会将自由变量销毁,而且go不支持手动销毁变量,只能使用 = nil来解决。