聊聊golang的defer的使用
序
本文主要研究一下golang的defer
defer
- return先賦值(對于命名返回值),然后執(zhí)行defer,最后函數(shù)返回
- defer函數(shù)調用的執(zhí)行順序與它們分別所屬的defer語句的執(zhí)行順序相反
- defer后面的表達式可以是func或者是method的調用,如果defer的函數(shù)為nil,則會panic
實例
實例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
實例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確定的返回值
實例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, " ")
}
}
多個defer函數(shù),按順序逆序執(zhí)行,這里輸出1 2 3
實例4
var fc func() string
func main() {
fmt.Println("hello")
defer fc()
}
由于defer指定的func為nil,這里panic
實例5
func main() {
for i := 3; i > 0; i-- {
defer func() {
fmt.Print(i, " ")
}()
}
}
由于defer這里調用的func沒有參數(shù),等執(zhí)行的時候,i已經為0,因而這里輸出3個0
小結
defer可以拆解為return賦值,defer執(zhí)行,最后代碼返回三步;defer的順序按逆序執(zhí)行。
doc
Defer_statements
Golang之Defer
golang中defer執(zhí)行時機與常見問題
到此這篇關于聊聊golang的defer的使用的文章就介紹到這了,更多相關golang defer內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Go語言獲取系統(tǒng)性能數(shù)據(jù)gopsutil庫的操作
這篇文章主要介紹了Go語言獲取系統(tǒng)性能數(shù)據(jù)gopsutil庫的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
Go實現(xiàn)分布式系統(tǒng)高可用限流器實戰(zhàn)
這篇文章主要為大家介紹了Go實現(xiàn)分布式系統(tǒng)高可用限流器實戰(zhàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06

