bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

Go語言中閉包的示例分析-創新互聯

這篇文章將為大家詳細講解有關Go語言中閉包的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

我們提供的服務有:網站設計制作、網站制作、微信公眾號開發、網站優化、網站認證、臨渭區ssl等。為上千多家企事業單位解決了網站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的臨渭區網站制作公司

閉包

在函數編程中經常用到閉包,閉包是什?它是怎么產生的及用來解決什么問題呢?先給出閉包的字面定義:閉包是由函數及其相關引用環境組合而成的實體(即:閉包=函數+引用環境)。這個從字面上很難理解,特別對于一直使用命令式語言進行編程的程序員們。

Go語言中的閉包

先看一個demo:

func f(i int) func() int {
 return func() int {
 i++
 return i
 }
}

函數f返回了一個函數,返回的這個函數就是一個閉包。這個函數中本身是沒有定義變量i的,而是引用了它所在的環境(函數f)中的變量i。

我們再看一下效果:

c1 := f(0)
c2 := f(0)
c1() // reference to i, i = 0, return 1
c2() // reference to another i, i = 0, return 1

c1跟c2引用的是不同的環境,在調用i++時修改的不是同一個i,因此兩次的輸出都是1。函數f每進入一次,就形成了一個新的環境,對應的閉包中,函數都是同一個函數,環境卻是引用不同的環境。

變量i是函數f中的局部變量,假設這個變量是在函數f的棧中分配的,是不可以的。因為函數f返回以后,對應的棧就失效了,f返回的那個函數中變量i就引用一個失效的位置了。所以閉包的環境中引用的變量不能夠在棧上分配。

escape analyze

在繼續研究閉包的實現之前,先看一看Go的一個語言特性:

func f() *Cursor {
 var c Cursor
 c.X = 500
 noinline()
 return &c
}

Cursor是一個結構體,這種寫法在C語言中是不允許的,因為變量c是在棧上分配的,當函數f返回后c的空間就失效了。但是,在Go語言規范中有說明,這種寫法在Go語言中合法的。語言會自動地識別出這種情況并在堆上分配c的內存,而不是函數f的棧上。

為了驗證這一點,可以觀察函數f生成的匯編代碼:

MOVQ $type."".Cursor+0(SB),(SP) // 取變量c的類型,也就是Cursor
PCDATA $0,$16
PCDATA $1,$0
CALL ,runtime.new(SB) // 調用new函數,相當于new(Cursor)
PCDATA $0,$-1
MOVQ 8(SP),AX // 取c.X的地址放到AX寄存器
MOVQ $500,(AX) // 將AX存放的內存地址的值賦為500
MOVQ AX,"".~r0+24(FP)
ADDQ $16,SP

識別出變量需要在堆上分配,是由編譯器的一種叫escape analyze的技術實現的。

如果輸入命令:

go build --gcflags=-m main.go

可以看到輸出:

Go語言中閉包的示例分析

注意:最后兩行,標識c逃逸了,被移動到堆中。escape analyze可以分析出變量的作用范圍,這是對垃圾回收很重要的一項技術。

關于“Go語言中閉包的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

新聞標題:Go語言中閉包的示例分析-創新互聯
文章出自:http://vcdvsql.cn/article40/didgeo.html

成都網站建設公司_創新互聯,為您提供網站維護域名注冊建站公司網站營銷定制開發關鍵詞優化

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

商城網站建設