最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

舉例講解Go語言中函數(shù)的閉包使用

 更新時間:2016年03月31日 16:35:15   作者:葉劍峰  
這篇文章主要介紹了Go語言中函數(shù)的閉包使用示例,函數(shù)閉包closure是編程語言中十分重要的特性,需要的朋友可以參考下

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

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

Go里有函數(shù)類型的變量,這樣,雖然不能在一個函數(shù)里直接聲明另一個函數(shù),但是可以在一個函數(shù)中聲明一個函數(shù)類型的變量,此時的函數(shù)稱為閉包(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是一個閉包,因為它是無名的函數(shù)類型的變量??梢哉J為它是一個閉包作坊,根據(jù)入?yún)⒎祷?生產(chǎn))一個閉包。這樣add5就是使用5作為add的參數(shù)得到的一個閉包。

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

個人理解:

其實理解閉包的最方便的方法就是將閉包函數(shù)看成一個類,一個閉包函數(shù)調(diào)用就是實例化一個類。

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

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

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 0
1 -2
3 -6
6 -12
10 -20
15 -30
21 -42
28 -56
36 -72
45 -90

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

相關文章

最新評論

蓬溪县| 杭锦旗| 临沭县| 南涧| 集贤县| 梅河口市| 佛山市| 五华县| 莱芜市| 台前县| 寻乌县| 奉化市| 镇赉县| 平阳县| 齐齐哈尔市| 华亭县| 大竹县| 娄底市| 会昌县| 沾化县| 巴彦淖尔市| 明溪县| 泰来县| 岳普湖县| 江源县| 陆良县| 东平县| 德令哈市| 新安县| 大厂| 五莲县| 永定县| 绥阳县| 朝阳县| 邛崃市| 本溪市| 临武县| 云阳县| 花莲县| 夏津县| 丹凤县|