golang中defer執(zhí)行時機的案例分析
示例代碼
package main import "fmt" func calcFunc(x int, y int) int { return x + y } func main() { // defer語句的執(zhí)行順序是,從右到左,逆序執(zhí)行 deferDemo() // deferDemo1函數(shù) demo1 := deferDemo1() fmt.Println(demo1) // 0 // deferDemo2函數(shù) demo2 := deferDemo2() fmt.Println(demo2) // 1 // deferDemo4 demo4 := deferDemo4() fmt.Println(demo4) // 1 // deferDemo5 demo5 := deferDemo5() fmt.Println(demo5) // 1 // deferDemo6 demo6 := deferDemo6() fmt.Println(demo6) // 2 // 難點解析 /* 分析: defer注冊順序: 1.defer fmt.Println("AA", calcFunc(x, calcFunc(x, y))) 2.defer fmt.Println("BB", calcFunc(x, calcFunc(x, y))) defer執(zhí)行順序: 1. fmt.Println("BB", calcFunc(x, calcFunc(x, y))) 2. fmt.Println("AA", calcFunc(x, calcFunc(x, y))) */ x := 1 y := 2 // 注冊的時候 x = 1, y = 2 所以執(zhí)行的時候x = 1, y = 2 defer fmt.Println("AA", calcFunc(x, calcFunc(x, y))) // calcFunc(1,1+2) // 結(jié)果是:4 x = 10 // 注冊的時候x = 10, y = 2 所以執(zhí)行的時候x = 10, y = 2 defer fmt.Println("BB", calcFunc(x, calcFunc(x, y))) // calcFunc(10,10+2) // 結(jié)果是:22 y = 20 }
分析:
defer語句的執(zhí)行順序是,從右到左,逆序執(zhí)行
執(zhí)行deferDemo()函數(shù)時,會先執(zhí)行defer語句,再執(zhí)行函數(shù)體,函數(shù)體執(zhí)行完后,再執(zhí)行defer語句
執(zhí)行結(jié)果:
開啟defer
結(jié)束defer
defer語句6
defer語句5
defer語句4
defer語句3
defer語句2
defer語句1
demo:
func deferDemo() { fmt.Println("開啟defer") defer func() { fmt.Println("defer語句1") }() defer func() { fmt.Println("defer語句2") }() defer func() { fmt.Println("defer語句3") }() defer fmt.Println("defer語句4") defer fmt.Println("defer語句5") defer fmt.Println("defer語句6") fmt.Println("結(jié)束defer") }
deferDemo1執(zhí)行結(jié)果是 0,延遲執(zhí)行
func deferDemo1() int { var a int defer func() { a++ }() return a }
deferDemo2執(zhí)行結(jié)果是1:原因返回匿名返回值a等待函數(shù)體內(nèi)操作完成才會執(zhí)行return
func deferDemo2() (a int) { // 步驟一先賦值 //a = 0 // 步驟二再執(zhí)行defer語句 defer func() { a++ }() // 步驟三再執(zhí)行函數(shù)體 // 返回值a等待函數(shù)體內(nèi)操作完成才會執(zhí)行return return a }
deferDemo3執(zhí)行結(jié)果是1: 原因返回匿名返回值a等待函數(shù)體內(nèi)操作完成才會執(zhí)行return
func deferDemo3() (a int) { defer func() { a++ }() return a }
deferDemo4
func deferDemo4() int { x := 1 defer func(x int) { x++ // 內(nèi)部x和外面x不是同一個變量 }(x) return x // 1 }
deferDemo5
func deferDemo5() (x int) { x = 1 defer func(x int) { x++ // 內(nèi)部x和外面x不是同一個變量 }(x) return x // 1 }
deferDemo6
func deferDemo6() (x int) { x = 1 defer func() { x++ }() return x // 2 }
到此這篇關于golang中defer執(zhí)行時機的案例分析的文章就介紹到這了,更多相關go defer內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Go語言字典(map)用法實例分析【創(chuàng)建,填充,遍歷,查找,修改,刪除】
這篇文章主要介紹了Go語言字典(map)用法,結(jié)合實例形式較為詳細的分析了Go語言字典的創(chuàng)建、填充、遍歷、查找、修改、刪除等操作相關實現(xiàn)技巧,需要的朋友可以參考下2017-02-02Golang使用CGO與Plugin技術(shù)運行加載C動態(tài)庫
這篇文章主要介紹了Golang使用CGO與Plugin技術(shù)運行加載C動態(tài)庫,Golang?程序在運行時加載C動態(tài)庫的技術(shù),跳過了Golang項目編譯階段需要鏈接C動態(tài)庫的過程,提高了Golang項目開發(fā)部署的靈活性2022-07-07