golang中defer執(zhí)行時(shí)機(jī)的案例分析
示例代碼
package main import "fmt" func calcFunc(x int, y int) int { return x + y } func main() { // defer語(yǔ)句的執(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 // 難點(diǎn)解析 /* 分析: defer注冊(cè)順序: 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 // 注冊(cè)的時(shí)候 x = 1, y = 2 所以執(zhí)行的時(shí)候x = 1, y = 2 defer fmt.Println("AA", calcFunc(x, calcFunc(x, y))) // calcFunc(1,1+2) // 結(jié)果是:4 x = 10 // 注冊(cè)的時(shí)候x = 10, y = 2 所以執(zhí)行的時(shí)候x = 10, y = 2 defer fmt.Println("BB", calcFunc(x, calcFunc(x, y))) // calcFunc(10,10+2) // 結(jié)果是:22 y = 20 }
分析:
defer語(yǔ)句的執(zhí)行順序是,從右到左,逆序執(zhí)行
執(zhí)行deferDemo()函數(shù)時(shí),會(huì)先執(zhí)行defer語(yǔ)句,再執(zhí)行函數(shù)體,函數(shù)體執(zhí)行完后,再執(zhí)行defer語(yǔ)句
執(zhí)行結(jié)果:
開啟defer
結(jié)束defer
defer語(yǔ)句6
defer語(yǔ)句5
defer語(yǔ)句4
defer語(yǔ)句3
defer語(yǔ)句2
defer語(yǔ)句1
demo:
func deferDemo() { fmt.Println("開啟defer") defer func() { fmt.Println("defer語(yǔ)句1") }() defer func() { fmt.Println("defer語(yǔ)句2") }() defer func() { fmt.Println("defer語(yǔ)句3") }() defer fmt.Println("defer語(yǔ)句4") defer fmt.Println("defer語(yǔ)句5") defer fmt.Println("defer語(yǔ)句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)操作完成才會(huì)執(zhí)行return
func deferDemo2() (a int) { // 步驟一先賦值 //a = 0 // 步驟二再執(zhí)行defer語(yǔ)句 defer func() { a++ }() // 步驟三再執(zhí)行函數(shù)體 // 返回值a等待函數(shù)體內(nèi)操作完成才會(huì)執(zhí)行return return a }
deferDemo3執(zhí)行結(jié)果是1: 原因返回匿名返回值a等待函數(shù)體內(nèi)操作完成才會(huì)執(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不是同一個(gè)變量 }(x) return x // 1 }
deferDemo5
func deferDemo5() (x int) { x = 1 defer func(x int) { x++ // 內(nèi)部x和外面x不是同一個(gè)變量 }(x) return x // 1 }
deferDemo6
func deferDemo6() (x int) { x = 1 defer func() { x++ }() return x // 2 }
到此這篇關(guān)于golang中defer執(zhí)行時(shí)機(jī)的案例分析的文章就介紹到這了,更多相關(guān)go defer內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語(yǔ)言字典(map)用法實(shí)例分析【創(chuàng)建,填充,遍歷,查找,修改,刪除】
這篇文章主要介紹了Go語(yǔ)言字典(map)用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Go語(yǔ)言字典的創(chuàng)建、填充、遍歷、查找、修改、刪除等操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-02-02Go項(xiàng)目實(shí)現(xiàn)優(yōu)雅關(guān)機(jī)與平滑重啟功能
無(wú)論是優(yōu)雅關(guān)機(jī)還是優(yōu)雅重啟歸根結(jié)底都是通過(guò)監(jiān)聽特定系統(tǒng)信號(hào),然后執(zhí)行一定的邏輯處理保障當(dāng)前系統(tǒng)正在處理的請(qǐng)求被正常處理后再關(guān)閉當(dāng)前進(jìn)程,這篇文章主要介紹了Go實(shí)現(xiàn)優(yōu)雅關(guān)機(jī)與平滑重啟 ,需要的朋友可以參考下2022-10-10go zero微服務(wù)高在請(qǐng)求量下如何優(yōu)化
這篇文章主要為大家介紹了go zero微服務(wù)高在請(qǐng)求量下的優(yōu)化處理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07Golang使用CGO與Plugin技術(shù)運(yùn)行加載C動(dòng)態(tài)庫(kù)
這篇文章主要介紹了Golang使用CGO與Plugin技術(shù)運(yùn)行加載C動(dòng)態(tài)庫(kù),Golang?程序在運(yùn)行時(shí)加載C動(dòng)態(tài)庫(kù)的技術(shù),跳過(guò)了Golang項(xiàng)目編譯階段需要鏈接C動(dòng)態(tài)庫(kù)的過(guò)程,提高了Golang項(xiàng)目開發(fā)部署的靈活性2022-07-07詳解Go如何優(yōu)雅的對(duì)時(shí)間進(jìn)行格式化
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中是如何優(yōu)雅的對(duì)時(shí)間進(jìn)行格式化的,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-06-06