在golang當中,defer代碼塊會在函數調用鏈表中增加一個函數調用。這個函數調用不是普通的函數調用,而是會在函數正常返回,也就是return之后添加一個函數調用。因此,defer通常用來釋放函數內部變量。
通過defer,我們可以在代碼中優雅的關閉/清理代碼中所使用的變量。defer作為golang清理變量的特性,有其獨有且明確的行為。
package main
func main() {
test()
}func test() {
println("test1") defer func() {
println("defer test2")
}()
println("test3")
}執行結果如下:
test1 test3 defer test2
很清楚地看到,有defer那個函數最后才執行的
現在改一下代碼,讓代碼panic,當拋出異常時,defer延遲函數還會執行嗎?
package main
func main() {
test()
}func test() {
println("test1")
panic("panic") defer func() {
println("defer test2")
}()
println("test3")
}輸出
test1 panic: panic Process finished with exit code 2
延遲函數居然沒有執行,為什么會這樣呢?是因為panic在延遲函數之前了,再改一下代碼如下
package main
func main() {
test()
}func test() {
println("test1") defer func() {
println("defer test2")
}()
panic("panic")
println("test3")
}輸出
test1 defer test2 panic: panic
延遲函數執行了,可以看到panic在延遲函數之前延遲函數是執行不了的,畢竟拋出異常。
以上就是golang defer什么時候執行的詳細內容,更多請關注億速云其它相關文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。