序
本文主要研究一下golang的defer
defer
- return先賦值(對(duì)于命名返回值),然后執(zhí)行defer,最后函數(shù)返回
- defer函數(shù)調(diào)用的執(zhí)行順序與它們分別所屬的defer語句的執(zhí)行順序相反
- defer后面的表達(dá)式可以是func或者是method的調(diào)用,如果defer的函數(shù)為nil,則會(huì)panic
實(shí)例
實(shí)例1
// f returns 42
func f() (result int) {
defer func() {
// result is accessed after it was set to 6 by the return statement
result *= 7
}()
return 6
}
這里return先給result賦值為6,之后執(zhí)行defer,result變?yōu)?2,最后返回42
實(shí)例2
func f() int {
result := 6
defer func() {
// result is accessed after it was set to 6 by the return statement
result *= 7
}()
return result
}
這里return確定返回值6,之后defer修改result,最后函數(shù)返回return確定的返回值
實(shí)例3
func multiDefer() {
for i := 3; i > 0; i-- {
defer func(n int) {
fmt.Print(n, " ")
}(i)
}
for i := 3; i > 0; i-- {
defer fmt.Print(i, " ")
}
}
多個(gè)defer函數(shù),按順序逆序執(zhí)行,這里輸出1 2 3
實(shí)例4
var fc func() string
func main() {
fmt.Println("hello")
defer fc()
}
由于defer指定的func為nil,這里panic
實(shí)例5
func main() {
for i := 3; i > 0; i-- {
defer func() {
fmt.Print(i, " ")
}()
}
}
由于defer這里調(diào)用的func沒有參數(shù),等執(zhí)行的時(shí)候,i已經(jīng)為0,因而這里輸出3個(gè)0
小結(jié)
defer可以拆解為return賦值,defer執(zhí)行,最后代碼返回三步;defer的順序按逆序執(zhí)行。
doc
Defer_statements
Golang之Defer
golang中defer執(zhí)行時(shí)機(jī)與常見問題
到此這篇關(guān)于聊聊golang的defer的使用的文章就介紹到這了,更多相關(guān)golang defer內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- Golang之defer 延遲調(diào)用操作
- Golang學(xué)習(xí)筆記之延遲函數(shù)(defer)的使用小結(jié)
- golang中defer的關(guān)鍵特性示例詳解
- golang中defer的使用規(guī)則詳解
- Golang巧用defer進(jìn)行錯(cuò)誤處理的方法
- Golang 的defer執(zhí)行規(guī)則說明