和變數的宣告不同,go語言不能在函式裡宣告另外乙個函式。所以在go的原始檔裡,函式宣告都是出現在最外層的。
「宣告」就是把一種型別的變數和乙個名字聯絡起來。
go裡有函式型別的變數,這樣,雖然不能在乙個函式裡直程式設計客棧接宣告另乙個函式,但是可以在乙個函式中宣告乙個函式型別的變數,此時的函式稱為閉包(closure)。
例:複製** **如下:
packagemain
import"fmt"
funcmain()
}add5:=add(5)
fmt.println("add5(10)=",add5(10))}
這個例子唯一的使用價值大概就是用來展示閉包的構建和使用。
add是乙個閉包,因為它是無名的函式型別的變數。可以認為它是乙個閉包作坊,根據入參返回(生產)乙個閉包。這樣add5就是使用5作為add的引數得到的乙個閉包。
閉包的宣告是在另乙個函式的內部,形成巢狀。和塊的巢狀一樣,內層的變數可以遮蓋同名的外層的變數,而且外層變數可以直接在內層使用。如add的base引數在return返回的閉包的外層,所以它的值5在add返回並賦值給add5後依舊存在。當add5執行時,引數i可以從這個外層得到的base相加,得到結果15.
個人理解:
其實理解閉包的最方便的方法就是將閉包函式看成乙個類ozczjwicex,乙個閉包函式呼叫就是例項化乙個類。
然後就可以根據類的角度看出哪些是「全域性變數」,哪些是「區域性變數」了。
比如上例中的adder函式返回func(int) int 的函式
pos和neg分別例項化了兩個「閉包類」,在這個「閉包類」中有個「閉包全域性變數」sum。所以這樣就很好理解返回的結果了。
再來看下面乙個例子:
複製** **如下:
package main
import "fmt"
func adder() func(int) int
}func main()
}執行返回結果:
0 01 -2
3 -6
6 -12
10 -20
15 -30
21 -42
28 -56
36 -72
45 -90
這個就是go中的閉包,乙個函式和與其相關的引用環境組合而成的實體。
本文標題: 舉例講解go語言中函式的閉包使用
本文位址:
go語言中閉包
閉包 closure 在一些語言中,在函式中可以 巢狀 定義另乙個函式時,如果內部的函式引用了外部的函式的變數,則可能產生閉包。閉包可以用來在乙個函式與一組 私有 變數之間建立關聯關係。在給定函式被多次呼叫的過程中,這些私有變數能夠保持其永續性。golang的閉包 函式在golang中是 一等公民 ...
GO語言中的閉包
package main import fmt import fmt func main r res fmt.println r 1 r2 res fmt.println r2 2 r3 res fmt.println r3 3 乙個外層函式中有內層函式,該內層函式中,會操作外層函式的區域性變數 外...
go語言中的閉包結構
每次呼叫 increment都會重新生成乙個閉包結構中的變數 內層函式 外層函式區域性變數 可以是入參或者定義的區域性變數 閉包結構 如果將乙個內層函式作為函式返回值 內層函式中又涉及到外層函式的區域性變數 自己定義或者外部傳進來的引數,都是區域性變數 1 2 條件滿足後,就會導致該區域性變數的宣告...