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.其他语言的闭包
- python的闭包
def adder():
sum = 0
def f(value):
nonlocal sum
sum += value
return sum
return f
- python原生支持闭包
- 使用__closure__来查看闭包内容
- c++的闭包
auto adder() {
auto sum = 0;
return [=] (int value) mutable {
sum += value;
return sum;
};
}
- 过去:stl或者boost带有类似库
- c++11及以后:支持闭包
- 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 函数与闭包的主要内容,如果未能解决你的问题,请参考以下文章