函数式编程vs函数式指针
- 函数式一等公民:参数、变量、返回值都可以是函数
- 高阶函数:参数可以是函数
- 函数->闭包
“正统”函数式编程
- 不可变性:不能有状态,只有常量和函数
- 函数只能有一个参数
闭包
看下面这段代码:
func adder() func(int) int {sum := 0return func(v int) int {sum += vreturn sum}}func main() {a := adder()for i := 0; i < 10; i++ {fmt.Println(a(i))}}
代码的输出结果如下:
看下面的图,局部变量就是v,自由变量就是sum,返回函数的时候,也会将sum的指正带上,且sum会保存在内存中,只要还有函数引用这个变量,这个变量就不会被回收
下面是稍微正统写法的闭包
type iAdder func(int) (int, iAdder)func adder2(base int) iAdder {return func(v int) (int, iAdder) {return base + v, adder2(base + v)}}func main() {b := adder2(0)for i := 0; i < 10; i++ {var s ints, b = b(i)fmt.Println(s)}}
