a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > Golang > 正文

舉例講解Go語言中函數的閉包使用

2020-04-01 19:11:14
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Go語言中函數的閉包使用示例,函數閉包closure是編程語言中十分重要的特性,需要的朋友可以參考下
 

和變量的聲明不同,Go語言不能在函數里聲明另外一個函數。所以在Go的源文件里,函數聲明都是出現在最外層的。

“聲明”就是把一種類型的變量和一個名字聯系起來。

Go里有函數類型的變量,這樣,雖然不能在一個函數里直接聲明另一個函數,但是可以在一個函數中聲明一個函數類型的變量,此時的函數稱為閉包(closure)。

例:

 

復制代碼代碼如下:

 

packagemain
 
import"fmt"
 
funcmain(){
    add:=func(baseint)func(int)(int){
        returnfunc(iint)(int){
            returnbase+i
        }
    }
    
    add5:=add(5)
    fmt.Println("add5(10)=",add5(10))
}

 

 

 

這個例子唯一的使用價值大概就是用來展示閉包的構建和使用。

add是一個閉包,因為它是無名的函數類型的變量??梢哉J為它是一個閉包作坊,根據入參返回(生產)一個閉包。這樣add5就是使用5作為add的參數得到的一個閉包。

閉包的聲明是在另一個函數的內部,形成嵌套。和塊的嵌套一樣,內層的變量可以遮蓋同名的外層的變量,而且外層變量可以直接在內層使用。如add的base參數在return返回的閉包的外層,所以它的值5在add返回并賦值給add5后依舊存在。當add5執行時,參數i可以從這個外層得到的base相加,得到結果15.

個人理解:

其實理解閉包的最方便的方法就是將閉包函數看成一個類,一個閉包函數調用就是實例化一個類。

然后就可以根據類的角度看出哪些是“全局變量”,哪些是“局部變量”了。

比如上例中的adder函數返回func(int) int 的函數

pos和neg分別實例化了兩個“閉包類”,在這個“閉包類”中有個“閉包全局變量”sum。所以這樣就很好理解返回的結果了。

再來看下面一個例子:

 

復制代碼代碼如下:

package main

 

import "fmt"

func adder() func(int) int {
     sum := 0
     return func(x int) int {
          sum += x
          return sum
     }
}

func main() {
     pos, neg := adder(), adder()
     for i := 0; i < 10; i++ {
          fmt.Println(
               pos(i),
               neg(-2*i),
          )
     }
}

 

 

運行返回結果:

0 01 -23 -66 -1210 -2015 -3021 -4228 -5636 -7245 -90

這個就是Go中的閉包,一個函數和與其相關的引用環境組合而成的實體。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产精品久久久久久久久免费 | 国产视频亚洲精品 | 特级毛片在线观看 | 国产一区免费视频 | 久久精品小视频 | 精品久久久久久 | 精品一二三区视频 | 怡红院免费在线视频 | 精品亚洲一区二区 | 国产成人免费 | 日韩高清中文字幕 | 日韩中文字幕视频在线观看 | 国产九九九精品 | 国产日韩欧美 | 欧美精品一区二 | 欧美三级 欧美一级 | 欧美精品一区二区三区四区五区 | 日本精品视频 | 一区二区三区视频在线观看 | 夜夜操操操 | 精品久久久久久久久久久 | 久久久久亚洲av毛片大全 | 成人高清在线观看 | 日韩精品一区二区在线观看 | 久久9久久 | 91麻豆精品国产91久久久久久 | 天堂视频中文字幕 | 国产精品一区二区三区99 | 在线观看国产视频 | 一区二区在线免费观看 | 国产成人免费在线观看 | 久久伦理中文字幕 | 久久性| 精品少妇一区二区 | 日韩在线精品 | 欧美中文在线 | 日本中文字幕一区二区 | 欧洲毛片 | 色综合二区 | 成年人免费看 | 亚洲精品一区二区三区 |