新聞中心
本篇文章為大家展示了Go語言中defer的示例分析,內(nèi)容簡明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

成都創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供阜城網(wǎng)站建設(shè)、阜城做網(wǎng)站、阜城網(wǎng)站設(shè)計(jì)、阜城網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、阜城企業(yè)網(wǎng)站模板建站服務(wù),10余年阜城做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
Go語言中的defer機(jī)制。
今天我們來看一段defer 機(jī)制代碼:
func calc(index string, a, b int) int {
ret := a + b
fmt.Println(index, a, b, ret)
return ret
}
func main() {
a := 1
b := 2
defer calc("1", a, calc("10", a, b))
a = 0
defer calc("2", a, calc("20", a, b))
b = 1
} 那么你覺得這段代碼的正確輸出是什么呢?
我們知道的defer是按照FILO(Fisrt In Last Out)的原則進(jìn)行調(diào)用的。我們按照這個(gè)規(guī)則分析可能會(huì)得出下面的結(jié)果:
20 0 2 2
2 0 2 2
10 1 2 3
1 1 3 4 但是當(dāng)我們運(yùn)行的時(shí)候,結(jié)果其實(shí)是下面這個(gè):
10 1 2 3
20 0 2 2
2 0 2 2
1 1 3 4 怎么會(huì)這樣呢?這就要說到官方對(duì)defer的解釋了。
defer語句將函數(shù)調(diào)用推送到列表上。保存的調(diào)用列表在周圍函數(shù)返回后執(zhí)行。Defer通常用于簡化執(zhí)行各種清理操作的函數(shù)。
官方說的是會(huì)在包含defer的函數(shù)“返回”時(shí),調(diào)用defer列表(滿足FILO)。但是官方的這個(gè)并沒有說清楚怎么調(diào)用。而現(xiàn)實(shí)情況是,defer在使用時(shí)會(huì)保存當(dāng)前的所有變量,如果遇到這種變量中有函數(shù)的,會(huì)先進(jìn)行函數(shù)調(diào)用得到值,然后保存下來。
defer實(shí)際步驟如下:
1. 在defer表達(dá)式的地方,會(huì)調(diào)用runtime.deferproc(size int32, fn *funcval)保存延時(shí)調(diào)用,注意這里保存了延時(shí)調(diào)用的參數(shù)
2. 在return時(shí),先將返回值保存起來
3. 按FILO順序調(diào)用runtime.deferreturn,即延時(shí)調(diào)用
4. RET指令
所以在本文中執(zhí)行到第一個(gè)defer時(shí),會(huì)先計(jì)算所有的參數(shù),并壓入棧。然后到第二個(gè)defer時(shí),再計(jì)算所有的參數(shù),再壓入棧。最后在return的時(shí)候依次把第二個(gè)的defer和第一個(gè)defer彈出。最終就是我們看到的結(jié)果。
上述內(nèi)容就是Go語言中defer的示例分析,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
分享文章:Go語言中defer的示例分析
本文來源:http://m.biofuelwatch.net/article/ispdoi.html


咨詢
建站咨詢
