码迷,mamicode.com
首页 > 其他好文 > 详细

Go 函数与闭包

时间:2020-02-04 12:21:32      阅读:91      评论:0      收藏:0      [点我收藏+]

标签:sum   其他   final   turn   不可变   class   接口   return   查看   

函数

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 函数与闭包

标签:sum   其他   final   turn   不可变   class   接口   return   查看   

原文地址:https://www.cnblogs.com/tulipgirl/p/12258910.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!