Go 語言支持匿名函數,可作爲閉包。
從匿名函數角度:
- 優越性在於可以直接使用函數內的變量,不必申明
- 動態創建的特性,該特性使得匿名函數不用通過參數傳遞的方式,就可以直接引用外部的變量。
其實理解閉包的類似看成C++中的一個類,一個閉包函數調用就是實例化一個類。
根據類的角度看出哪些是“全局變量”,哪些是“局部變量”
函數返回結果分別實例化了“閉包類”,在這個“閉包類”中有個“閉包全局變量”。
一個函數和與其相關的引用環境組合而成的實體。
package main
import (
"fmt"
"unsafe"
)
func getSequence() func() int {
i:=0
return func() int {
i+=1
return i
}
}
func main(){
/* nextNumber 爲一個函數,函數 i 爲 0 */
/* nextNumber 爲一個函數,函數 i 爲 0 */
nextNumber := getSequence()
fmt.Println("####netNumber",unsafe.Pointer(&nextNumber))
/* 調用 nextNumber 函數,i 變量自增 1 並返回 */
fmt.Println(nextNumber())
fmt.Println(nextNumber())
fmt.Println(nextNumber())
/* 創建新的函數 nextNumber1,並查看結果 */
nextNumber1 := getSequence()
fmt.Println("######netNumber1",unsafe.Pointer(&nextNumber1))
fmt.Println(nextNumber1())
fmt.Println(nextNumber1())
}
####netNumber 0xc000006028
1
2
3
######netNumber1 0xc000006038
1
2
Process finished with exit code 0