函数式编程vs函数式指针

  • 函数式一等公民:参数、变量、返回值都可以是函数
  • 高阶函数:参数可以是函数
  • 函数->闭包

“正统”函数式编程

  • 不可变性:不能有状态,只有常量和函数
  • 函数只能有一个参数

闭包

看下面这段代码:

  1. func adder() func(int) int {
  2. sum := 0
  3. return func(v int) int {
  4. sum += v
  5. return sum
  6. }
  7. }
  8. func main() {
  9. a := adder()
  10. for i := 0; i < 10; i++ {
  11. fmt.Println(a(i))
  12. }
  13. }

代码的输出结果如下:
image.png

看下面的图,局部变量就是v,自由变量就是sum,返回函数的时候,也会将sum的指正带上,且sum会保存在内存中,只要还有函数引用这个变量,这个变量就不会被回收
image.png

下面是稍微正统写法的闭包

  1. type iAdder func(int) (int, iAdder)
  2. func adder2(base int) iAdder {
  3. return func(v int) (int, iAdder) {
  4. return base + v, adder2(base + v)
  5. }
  6. }
  7. func main() {
  8. b := adder2(0)
  9. for i := 0; i < 10; i++ {
  10. var s int
  11. s, b = b(i)
  12. fmt.Println(s)
  13. }
  14. }