中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

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

荔波县| 巴马| 夏河县| 本溪市| 云浮市| 湄潭县| 波密县| 元谋县| 广昌县| 阳曲县| 乃东县| 桃源县| 富裕县| 柳州市| 卢龙县| 江油市| 邢台县| 尖扎县| 黔东| 海丰县| 汉中市| 宁化县| 巴中市| 安陆市| 丁青县| 博乐市| 绥中县| 南平市| 巢湖市| 邳州市| 建德市| 林西县| 吉木乃县| 陵川县| 土默特左旗| 堆龙德庆县| 阜平县| 弥渡县| 柘城县| 阜城县| 清新县|