在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中文網其他相關文章!