package main
import "fmt"
func main(){
resule := getNum()
fmt.Println(resule())
}
func getNum() func() int {
i:=0
return func ()int {
i+=1
return i
}
}
以上是GO文檔中的閉包寫法,當第一次但到這個的時候,就像我第一次看到Java 中的匿名內部類,我是懵逼的。
後來細細分解了一下 :
首先看一下getNum ( )這個方法 文檔中寫的有點簡化 ,這裏我寫完整一下:
func getNum() (func () (int)){//這裏返回值是一個方法
i:=0
return func()(int){//返回值是一個 int類型
return i
}
}
從上邊代碼來看當我們 在main函數中調用 result := getNum()
的時候 ,獲取到result 其實是方法getNum () 的返回值,也是一個方法。
這個時候result := getNum ();
等價於
result := func()int {
i:=0
return func()(int){//返回值是一個 int類型
return i
}
}
這個時候有沒有發現很想Java 中的匿名內部類了;
ok 我們繼續 這個時候 result 其實只是一個方法,如果我們打印 fmt.pringln(result)
的話得到的是內存地址 並不是我們想要的結果 ;想想Java 中也是啊,所以,想要獲取 文檔中i 的 值 我們還需要這樣寫
result := getNum()
fmt.println(result())
好了,以上就是對Go 閉包的詳解,如果小夥伴們還是不怎麼清楚可以看看另一個案例
下邊這個案例我們給他傳值了—-
package main
import "fmt"
func main(){
resule := getNum()
i:=0
fmt.Println(resule(i))
}
func getNum() func(i int) int {
return func (i int )int {
i+=1
return i
}
}
可以相互對比一下,我相信這樣應該就能明白閉包的寫法了