goLang闭包理解

闭包是为了在函数内部捕获外部变量(不声明为全局变量)

例如实现一个计数器 从base开始 每调用一个加一

在c++ 中可以采用仿函数,在调用构造函数时传入base 或者使用lambda函数,捕获base变量

class fun{
private:
    int base;
public:
    fun(int _base):base(_base){}
    int operator() (int x){
        return base+x;
    }
};
int main()
{
    int cur=0;
    auto f = fun(5);
    while(cur<10){
        cout<<f(cur++)<<endl;
    }
    return 0;
}

或者写法2

int main()
{
    int base = 5;
    auto f = [base](int cur){return base+cur;};
    int cur=0;
    while(cur<10){
        cout<<f(cur++)<<endl;
    }
    return 0;
}

或者写法3: bind

int main()
{
    int base = 5;
    auto f = [](int cur, int base){return base+cur;};
    // placeholder就是位置参数的占位符 表示这里是对应原来函数的第i个参数
    auto f_bind = bind(f, placeholders::_1, base);
    int cur=0;
    while(cur<10){
        cout<<f_bind(cur++)<<endl;
    }
    return 0;
}

那么在goLang中把匿名函数作为返回值, 在第一次定义closure时确定base值, 然后通过func1 调用

func closure(base int) func(int) int{
	return func(i int) int {
		return base+i
	}
}
func main() {
	func1 := closure(5)
	for cur:=0;cur<10;cur++{
		fmt.Println(func1(cur))
	}
}

 补充:

匿名函数就是在定义时不声明名字 可以直接调用或者赋值给其他变量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值