闭包是为了在函数内部捕获外部变量(不声明为全局变量)
例如实现一个计数器 从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))
}
}
补充:
匿名函数就是在定义时不声明名字 可以直接调用或者赋值给其他变量