舉例講解Go語言中函式的閉包使用

2022-09-24 21:12:13 字數 1184 閱讀 4979

和變數的宣告不同,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 條件滿足後,就會導致該區域性變數的宣告...