您好,登錄后才能下訂單哦!
本篇文章為大家展示了Go語言中defer的示例分析,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
Go語言中的defer機制。
今天我們來看一段defer 機制代碼:
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)的原則進行調用的。我們按照這個規則分析可能會得出下面的結果:
20 0 2 2
2 0 2 2
10 1 2 3
1 1 3 4
但是當我們運行的時候,結果其實是下面這個:
10 1 2 3
20 0 2 2
2 0 2 2
1 1 3 4
怎么會這樣呢?這就要說到官方對defer的解釋了。
defer語句將函數調用推送到列表上。保存的調用列表在周圍函數返回后執行。Defer通常用于簡化執行各種清理操作的函數。
官方說的是會在包含defer的函數“返回”時,調用defer列表(滿足FILO)。但是官方的這個并沒有說清楚怎么調用。而現實情況是,defer在使用時會保存當前的所有變量,如果遇到這種變量中有函數的,會先進行函數調用得到值,然后保存下來。
defer實際步驟如下:
1. 在defer表達式的地方,會調用runtime.deferproc(size int32, fn *funcval)保存延時調用,注意這里保存了延時調用的參數
2. 在return時,先將返回值保存起來
3. 按FILO順序調用runtime.deferreturn,即延時調用
4. RET指令
所以在本文中執行到第一個defer時,會先計算所有的參數,并壓入棧。然后到第二個defer時,再計算所有的參數,再壓入棧。最后在return的時候依次把第二個的defer和第一個defer彈出。最終就是我們看到的結果。
上述內容就是Go語言中defer的示例分析,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。