您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關go語言中如何使用閉包函數,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
一、以前用閉包函數都是為了寫起來省事,最近試著學學go,發現go里面的閉包函數挺怪,例如下面的代碼:
package main import "fmt" func main() { var list []func() int for i := 0; i < 3; i++ { list = append(list, func() int { return i }) } for _, fun := range list { fmt.Printf("%v", fun()) } }
感覺好像應該輸出 0 1 2 ,而實際上會輸出 3 3 3 。
我是這樣理解的:
1、在添加函數切片的for循環中,只是添加了函數,但函數并未執行,若執行,需要在函數后加(),同時函數編譯到內存中的空間是固定的,所以函數的地址應該也是固定的,也就是說是同一個函數。
2、i變量雖然是在for中的,但是由于匿名函數也在for中,所以匿名函數是可以使用i變量的,實際測試,函數中i變量的地址也確實是for循環中i變量的地址。
3、第一個for循環退出之前,是運行了3次i++,所以最后i變量的值是3。
4、第二個for循環運行函數,函數中的i變量是3,自然輸出3。
匿名函數確實有點繞。
二、go簡易教程中的一個例子說明
package main import "fmt" func getSequence() func() int { i:=0 return func() int { i+=1 return i } } func main(){ /* nextNumber 為一個函數,函數 i 為 0 */ nextNumber := getSequence() /* 調用 nextNumber 函數,i 變量自增 1 并返回 */ fmt.Println(nextNumber()) fmt.Println(nextNumber()) fmt.Println(nextNumber()) /* 創建新的函數 nextNumber1,并查看結果 */ nextNumber1 := getSequence() fmt.Println(nextNumber1()) fmt.Println(nextNumber1()) }
我的理解,函數getSequence的返回值是匿名函數func() int,i:=0 是屬于getSequence 函數的變量,所以當nextNumber := getSequence() 后,這個這是就歸屬于nextNumber,而nextNumber()運行的是getSequence的匿名函數func() int,所以i變量的值在nextNumber里是一直保留著的,會隨著匿名函數運行一次加1。
看完上述內容,你們對go語言中如何使用閉包函數有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。