亚洲激情专区-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

纳雍县| 邢台市| 兴安盟| 竹溪县| 武宁县| 芜湖市| 思茅市| 石台县| 若尔盖县| 赤壁市| 霍林郭勒市| 扶余县| 磴口县| 岑溪市| 锦屏县| 千阳县| 合阳县| 呼图壁县| 阳信县| 梅州市| 仪征市| 托克托县| 都昌县| 武夷山市| 阳新县| 芜湖市| 基隆市| 台江县| 聊城市| 荃湾区| 淄博市| 栾城县| 尼玛县| 周口市| 神木县| 安图县| 衡东县| 临夏县| 金湖县| 北海市| 西林县|