中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

go語言中如何使用閉包函數

發布時間:2021-07-28 13:55:17 來源:億速云 閱讀:195 作者:Leah 欄目:大數據

今天就跟大家聊聊有關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語言中如何使用閉包函數有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

瑞金市| 汉阴县| 永修县| 潍坊市| 五原县| 玛沁县| 安义县| 武清区| 文登市| 汶川县| 芜湖市| 班玛县| 怀化市| 琼中| 万州区| 贵定县| 白城市| 福安市| 同德县| 迁安市| 武邑县| 通榆县| 东莞市| 蓬莱市| 图片| 新巴尔虎左旗| 平舆县| 光泽县| 巨鹿县| 高陵县| 吉木萨尔县| 鹤山市| 德令哈市| 龙里县| 大庆市| 黑河市| 阿克陶县| 古交市| 惠东县| 陈巴尔虎旗| 五家渠市|