我們今天說(shuō)的Go中的函數(shù)式編程主要是體現(xiàn)在閉包上面的待诅,比如
func adder() func(int) int {
sum := 0
return func(v int) int {
sum += v
return sum
}
}
func main() {
a := adder()
for i := 0; i < 10; i++ {
fmt.Printf("0 + 1 + ... + %d = %d\n", i, a(i))
}
}
我們首先對(duì)比兩個(gè)概念
函數(shù)式編程 vs 函數(shù)指針
- 函數(shù)是一等公民:參數(shù),變量害淤,返回值都可以是函數(shù)(C++只有函數(shù)指針 Java的函數(shù)不能作為參數(shù))
- 高階函數(shù)
- 函數(shù)->閉包
那么什么是正統(tǒng)的函數(shù)式編程呢扇雕?
- 不可變性:不能有狀態(tài),只有常量和函數(shù)
- 函數(shù)只能有一個(gè)參數(shù)
Go不會(huì)在正統(tǒng)上大作文章的窥摄,??
上面這張圖呀洼裤,很清楚的表達(dá)了閉包的概念,自由變量就是外面函數(shù)的變量相當(dāng)于sum溪王。我們來(lái)看一下正統(tǒng)的函數(shù)式編程是怎么做的呢,我們這邊馬馬虎虎的實(shí)現(xiàn)一把V岛АS狻!吱瘩!
type iAdder func(int) (int, iAdder)
func adder2(base int) iAdder {
return func(v int) (int, iAdder) {
return base + v, adder2(base + v)
}
}
func main() {
// // a := adder() is trivial and also works.
a := adder2(0)
for i := 0; i < 10; i++ {
var s int
s, a = a(i)
fmt.Printf("0 + 1 + ... + %d = %d\n",
i, s)
}
}
// 這樣的寫法可能不是很好懂道伟,但是這種寫法沒(méi)有自由變量在里面,會(huì)更安全一些。
最后我們來(lái)看一下其他語(yǔ)言是怎么實(shí)現(xiàn)閉包的蜜徽。
Python實(shí)現(xiàn)的方式
def adder(value):
sum = 10
def sumAll(value):
nonlocal sum
sum = sum+value
return sum
return sumAll
if __name__ =='__main__':
result = adder(sum)
# 打印環(huán)境變量
print(result.__closure__[0].cell_contents)
for x in range(10):
print(result(x))
Python是原生支持閉包的祝懂,你可以使用closure查看閉包內(nèi)容
C++實(shí)現(xiàn)閉包的方式
auto adder(){
auto sum = 0;
return [=] (int value) mutable {
sum += value;
return sum;
};
}
// c++ 11及以后:支持閉包,我沒(méi)有學(xué)過(guò)c++這里給大家貼出來(lái)拘鞋,只是讓大家感受一把Q馀睢!盆色!
ok, 怎么樣閉包掌握的怎么樣了呢??;彝堋!8舳恪摩梧!繼續(xù)加油吧!P怠=龈浮!下面還有函數(shù)式編程的干貨浑吟,敬請(qǐng)期待把s舷恕!B蛑谩7嗖凇!