golang 中多個 defer 的執行順序

2021-08-20 20:26:46 字數 1495 閱讀 9754

引用 ture go 中的乙個示例:

package main

import

"fmt"

func main()

fmt.println("done")

}

程式執行結果為:

counting

done98

7654

3210

從結果可以看出,defer的執行可以看做是乙個filo(first in last out) 棧。

在編寫程式時,如果遇到下面的執行流程,id1先獲取資源,然後id2通過id1獲取,而id2的釋放close必須要在id1之前,如下:

func fun()
如果使用defer,其執行順序和上面完全相同的,所以我們通常在open開啟資源後,立即使用defer close,不會引起釋放順序問題。

func fun()
func c() (i int) ()

return

1}

如上**,壓入棧的是乙個函式位址,函式執行完後,執行i++,會改變返回值,函式返回值為 2。

從上面的通過defer修改返回值,defer也可以用於控制恢復panic斷言。

package main

import

"fmt"

func main()

func f()

}()fmt.println("calling g.")

g(0)

fmt.println("returned normally from g.")

}func g(i int)

defer fmt.println("defer in g", i)

fmt.println("printing in g", i)

g(i +1)

}

執行結果為:

calling g.

printing in g 0

printing in g 1

printing in g 2

printing in g 3

panicking!

defer in g 3

defer in g 2

defer in g 1

defer in g 0

recovered in f 4

returned normally from f.

Golang中的defer使用

在golang當中,defer 塊會在函式呼叫鍊錶中增加乙個函式呼叫。這個函式呼叫不是普通的函式呼叫,而是會在函式正常返回,也就是return之後新增乙個函式呼叫。因此,defer通常用來釋放函式內部變數。為了更好的學習defer的行為,我們首先來看下面一段 func copyfile dstnam...

golang中defer和recover函式

defer語句是用來延遲執行 的,意思就是在執行一段 的時候,只有執行完畢那一時間,才會執行defer語句。而且在遇見多個defer的時候,最開始的defer會是最後乙個執行,可以通過以下 看出來 package main import fmt func main defer fmt.println...

golang中defer使用小結

golang語言中defer的使用場景較多,用於鎖的關閉,連線的延遲關閉等,通常在函式的結束時呼叫,詳細的講就是在函式結束時返回值賦值後,返回前執行defer的方法,最後才返回,另外defer確實有一定的開銷,拒絕濫用。第一點 defer 不帶函式執行,defer可以理解像棧,先進後出,看下面 fu...