Go 函数与闭包

Posted tulipgirl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 函数指针

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

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表达式均支持闭包

以上是关于Go 函数与闭包的主要内容,如果未能解决你的问题,请参考以下文章

Go 函数与闭包

Go语言学习匿名函数与闭包

Go语言的匿名函数与闭包的一些理解

Go语言-make陷阱和闭包函数

Go之闭包函数

Go语言中的闭包