91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

桐梓县| 麻阳| 台山市| 阜宁县| 白水县| 兴和县| 大城县| 萍乡市| 红河县| 荔波县| 普兰店市| 东台市| 德兴市| 平邑县| 冷水江市| 崇阳县| 庆云县| 即墨市| 辽宁省| 尉氏县| 宝应县| 云龙县| 河南省| 宣威市| 铜鼓县| 姜堰市| 道孚县| 彰化县| 漳州市| 衡南县| 贡觉县| 林芝县| 渭南市| 甘泉县| 伊宁县| 保亭| 孟连| 彭阳县| 温宿县| 邵阳县| 宁南县|