引用 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...