亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Go語言中defer的示例分析

發布時間:2021-12-27 13:50:44 來源:億速云 閱讀:149 作者:柒染 欄目:互聯網科技

本篇文章為大家展示了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的示例分析,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

饶平县| 巢湖市| 台中市| 临安市| 罗平县| 天峻县| 涟源市| 马鞍山市| 灌南县| 藁城市| 古浪县| 会昌县| 阜新市| 文山县| 大同市| 定西市| 静安区| 榆林市| 张北县| 宁津县| 梁河县| 双城市| 永安市| 莆田市| 衡山县| 天峨县| 色达县| 清原| 昌黎县| 古交市| 临潭县| 凤山县| 梁平县| 柘荣县| 兴和县| 尚志市| 柞水县| 定安县| 治县。| 赤峰市| 望谟县|