首頁 >後端開發 >Golang >golang中的defer關鍵字什麼時候生效

golang中的defer關鍵字什麼時候生效

王林
王林原創
2019-12-09 14:55:392774瀏覽

golang中的defer關鍵字什麼時候生效

在golang中,我們使用defer語句來進行一些錯誤處理和結束工作,它的作用類似java裡面finally關鍵字的作用。不過不論是java的finally關鍵字還是c 的Raii類,我們都能清楚地知道它們的作用域和執行的時機,那麼golang中defer關鍵字所處理的內容是在什麼時候執行的呢?

首先官方文件中說:函數傳回、函數結束或對應的goroutine發生panic的時候defer就會執行。

然後要注意的是因為golang支援多值返回,所以是在返回前把返回值壓到堆疊中的,而c語言是把返回值存到暫存器中返回。

golang回傳時,先把回傳值壓棧;然後執行defer函數,如果defer函數中有修改堆疊中的回傳值(不過不應該這麼做),那麼傳回值就會被修改;之後進行跳轉返回。

這樣的話我們就清楚了defer執行的時機了,即使你把defer寫在返回之前很遠的地方,它還是會在函數返回之前執行。

如果一個作用域中有多個defer,那麼傳回前的執行順序是先執行後呼叫的defer,再執行早呼叫的defer。

官方文件裡面有幾個例子可以很好地說明defer的作用時機,如下:

lock(l)
defer unlock(l)  // unlocking happens before surrounding function returns

// prints 3 2 1 0 before surrounding function returns
for i := 0; i <= 3; i++ {
    defer fmt.Print(i)
}

// f returns 1
func f() (result int) {
    defer func() {
        result++
    }()
    return 0
}

相關文章教學推薦:golang教學

#

以上是golang中的defer關鍵字什麼時候生效的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn