Go 閉包寫法解析

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
    }
}

可以相互對比一下,我相信這樣應該就能明白閉包的寫法了

發佈了96 篇原創文章 · 獲贊 74 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章