主頁(yè) > 知識(shí)庫(kù) > 舉例講解Go語(yǔ)言中函數(shù)的閉包使用

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

熱門(mén)標(biāo)簽:浙江人工智能外呼管理系統(tǒng) 谷歌便利店地圖標(biāo)注 電銷(xiāo)機(jī)器人可以補(bǔ)救房產(chǎn)中介嗎 百度地圖標(biāo)注搜索關(guān)鍵詞 成都呼叫中心外呼系統(tǒng)平臺(tái) ?兓? 電梯外呼訪客系統(tǒng) 最短的地圖標(biāo)注 騰訊外呼系統(tǒng)價(jià)格

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

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

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

例:

復(fù)制代碼 代碼如下:

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

 

這個(gè)例子唯一的使用價(jià)值大概就是用來(lái)展示閉包的構(gòu)建和使用。

add是一個(gè)閉包,因?yàn)樗菬o(wú)名的函數(shù)類(lèi)型的變量??梢哉J(rèn)為它是一個(gè)閉包作坊,根據(jù)入?yún)⒎祷?生產(chǎn))一個(gè)閉包。這樣add5就是使用5作為add的參數(shù)得到的一個(gè)閉包。

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

個(gè)人理解:

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

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

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

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

再來(lái)看下面一個(gè)例子:

復(fù)制代碼 代碼如下:

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

運(yùn)行返回結(jié)果:

0 0
1 -2
3 -6
6 -12
10 -20
15 -30
21 -42
28 -56
36 -72
45 -90

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

您可能感興趣的文章:
  • Go語(yǔ)言中append函數(shù)用法分析
  • GO語(yǔ)言延遲函數(shù)defer用法分析
  • Go語(yǔ)言中普通函數(shù)與方法的區(qū)別分析
  • Go語(yǔ)言的os包中常用函數(shù)初步歸納
  • Go語(yǔ)言常見(jiàn)哈希函數(shù)的使用
  • Go語(yǔ)言里的new函數(shù)用法分析
  • Golang的os標(biāo)準(zhǔn)庫(kù)中常用函數(shù)的整理介紹
  • 深入解析golang編程中函數(shù)的用法
  • Golang學(xué)習(xí)筆記(五):函數(shù)
  • Golang教程之不可重入函數(shù)的實(shí)現(xiàn)方法

標(biāo)簽:宜昌 眉山 邢臺(tái) 雅安 上海 盤(pán)錦 七臺(tái)河 紹興

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《舉例講解Go語(yǔ)言中函數(shù)的閉包使用》,本文關(guān)鍵詞  舉例,講解,語(yǔ),言中,函數(shù),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《舉例講解Go語(yǔ)言中函數(shù)的閉包使用》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于舉例講解Go語(yǔ)言中函數(shù)的閉包使用的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章