Go 函數與閉包

函數

1.函數與閉包

func adder() func (value int){
    sum := 0
    return func(value int) int{
        sum += value
        return sum
    }
}

func main() {
    adder := adder()
    for i := 0; i < 10; i++ {
        fmt.Println(adder(i))
    }
}

函數式編程 VS 函數指針java

  • 函數是一等公民:參數,變量,返回值均可以是函數
  • 高階函數
  • 函數 -> 閉包

2.「正統」函數式編程

  • 不可變性:不能有狀態,只有常量和函數
  • 函數只能有一個參數
type iAdder func(int) (int, iAdder)

func adder(base int) iAdder {
    return func(value int) (int, iAdder){
        return base+value, adder(base+value)
    }
}

func main(){
    a := adder(0)
    for i := 0; i < 10; i++ {
        fmt.Println(a(i))
    }
}

3.其餘語言的閉包

  1. python的閉包
def adder():
    sum = 0
    def f(value):
        nonlocal sum
        sum += value
        return sum
    return f
  • python原生支持閉包
  • 使用__closure__來查看閉包內容
  1. c++的閉包
auto adder() {
    auto sum = 0;
    return [=] (int value) mutable {
        sum += value;
        return sum;
    };
}
  • 過去:stl或者boost帶有相似庫
  • c++11及之後:支持閉包
  1. java的閉包
Function<Integer, Integer> adder() {
    final Holder<Integer> sum = new Holder<>(0);
    return (Integer value )-> {
        sum.value += value;
        return sum.value;
    };
}
  • 1.8之後:使用Fuction接口和Lambda表達式來建立函數對象
  • 匿名類或Lambda表達式均支持閉包
相關文章
相關標籤/搜索