亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

Go里有函數(shù)類型的變量,這樣,雖然不能在一個(gè)函數(shù)里直接聲明另一個(gè)函數(shù),但是可以在一個(gè)函數(shù)中聲明一個(gè)函數(shù)類型的變量,此時(shí)的函數(shù)稱為閉包(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à)值大概就是用來展示閉包的構(gòu)建和使用。

add是一個(gè)閉包,因?yàn)樗菬o名的函數(shù)類型的變量??梢哉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è)類,一個(gè)閉包函數(shù)調(diào)用就是實(shí)例化一個(gè)類。

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

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

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

再來看下面一個(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í)體。

相關(guān)文章

  • go語言靜態(tài)庫的編譯和使用方法

    go語言靜態(tài)庫的編譯和使用方法

    這篇文章主要介紹了go語言靜態(tài)庫的編譯和使用方法,本文以windows平臺為例,通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Go 語言json.Unmarshal 遇到的小問題(推薦)

    Go 語言json.Unmarshal 遇到的小問題(推薦)

    這篇文章主要介紹了 Go 語言json.Unmarshal 遇到的小問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Go調(diào)度器學(xué)習(xí)之goroutine調(diào)度詳解

    Go調(diào)度器學(xué)習(xí)之goroutine調(diào)度詳解

    這篇文章主要為大家詳細(xì)介紹了Go調(diào)度器中g(shù)oroutine調(diào)度的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-03-03
  • Golang仿ps實(shí)現(xiàn)獲取Linux進(jìn)程信息

    Golang仿ps實(shí)現(xiàn)獲取Linux進(jìn)程信息

    這篇文章主要為大家學(xué)習(xí)介紹了Golang如何仿ps實(shí)現(xiàn)獲取Linux進(jìn)程信息,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-07-07
  • golang如何實(shí)現(xiàn)抓取IP地址的蜘蛛程序詳解

    golang如何實(shí)現(xiàn)抓取IP地址的蜘蛛程序詳解

    這篇文章主要給大家介紹了關(guān)于利用golang如何實(shí)現(xiàn)抓取IP地址的蜘蛛程序的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • Golang實(shí)現(xiàn)文件夾的創(chuàng)建與刪除的方法詳解

    Golang實(shí)現(xiàn)文件夾的創(chuàng)建與刪除的方法詳解

    這篇文章主要介紹了如何利用Go語言實(shí)現(xiàn)對文件夾的常用操作:創(chuàng)建于刪除。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-05-05
  • GoFrame實(shí)現(xiàn)順序性校驗(yàn)示例詳解

    GoFrame實(shí)現(xiàn)順序性校驗(yàn)示例詳解

    這篇文章主要為大家介紹了GoFrame實(shí)現(xiàn)順序性校驗(yàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Go語言omitempty選項(xiàng)的實(shí)現(xiàn)

    Go語言omitempty選項(xiàng)的實(shí)現(xiàn)

    本文主要介紹了Go語言omitempty選項(xiàng)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • golang1.16新特性速覽(推薦)

    golang1.16新特性速覽(推薦)

    這篇文章主要介紹了golang1.16新特性速覽,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • 詳解Go程序添加遠(yuǎn)程調(diào)用tcpdump功能

    詳解Go程序添加遠(yuǎn)程調(diào)用tcpdump功能

    這篇文章主要介紹了go程序添加遠(yuǎn)程調(diào)用tcpdump功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05

最新評論