GO語(yǔ)言延遲函數(shù)defer用法詳解
go語(yǔ)言中
defer
最主要的目的是在函數(shù)執(zhí)行完畢后及時(shí)的釋放資源
入門(mén)案例
package main import "fmt" func sum(n1 int, n2 int) int { //當(dāng)執(zhí)行到defer時(shí),會(huì)將defer后面的語(yǔ)句壓入到獨(dú)立的棧中(我們?nèi)∶麨閐efer棧吧) //當(dāng)函數(shù)執(zhí)行完畢后,再?gòu)膁efer棧,先進(jìn)后出的方式出棧然后執(zhí)行 defer fmt.Println("ok1 n1=",n1) // 3. n1 defer fmt.Println("ok2 n2=",n2) //2. n2 res := n1 + n2 //res = 30,首先執(zhí)行 fmt.Println("ok3 res=",res) // 1. res = n1 + n2 return res } func main(){ res := sum(10,20) fmt.Println("main res=",res) }
main方法調(diào)用sum
函數(shù)
代碼執(zhí)行到第一個(gè)defer
后,編譯器(系統(tǒng))會(huì)將第一個(gè)defer
這段壓入到defer的棧中
(暫時(shí)不執(zhí)行)
注意事項(xiàng)
- 當(dāng)ggo執(zhí)行到一個(gè)
defer
時(shí),不會(huì)立刻執(zhí)行defer后的語(yǔ)句,而是將defer后的語(yǔ)句壓入一個(gè)獨(dú)立的棧中,然后繼續(xù)執(zhí)行函數(shù)下一條語(yǔ)句 - 當(dāng)執(zhí)行完畢后,再?gòu)?code>defer棧(只是為了理解這么叫,實(shí)際其實(shí)只是一個(gè)獨(dú)立的棧),依次從棧頂取出語(yǔ)句執(zhí)行(先進(jìn)后出原則)
- 在
defer
將語(yǔ)句放入棧時(shí),也會(huì)將相關(guān)的值拷貝同時(shí)入棧(入棧時(shí)是什么值就是什么值)
package main import "fmt" func sum(n1 int, n2 int) int { //當(dāng)執(zhí)行到defer時(shí),會(huì)將defer后面的語(yǔ)句壓入到獨(dú)立的棧中(我們?nèi)∶麨閐efer棧吧) //當(dāng)函數(shù)執(zhí)行完畢后,再?gòu)膁efer棧,先進(jìn)后出的方式出棧然后執(zhí)行 defer fmt.Println("ok1 n1=",n1) //n1 = 10 defer fmt.Println("ok2 n2=",n2) //n2 = 20 n1++ //添加代碼: n1++ n2++ //添加代碼: n2++ res := n1 + n2 fmt.Println("ok3 res=",res) //res = 32 return res } func main(){ res := sum(10,20) fmt.Println("main res=",res) //結(jié)果還是會(huì)被影響 res = 32 }
結(jié)果
defer最佳實(shí)踐
defer主要的價(jià)值是在當(dāng)函數(shù)執(zhí)行完畢后,可以及時(shí)釋放函數(shù)創(chuàng)建的資源
//示意代碼 func test(){ //關(guān)閉文件資源 file = openfile(文件名) defer file.close() //其他代碼 //連接的數(shù)據(jù)庫(kù)還是可以使用的 }
func test(){ //釋放數(shù)據(jù)庫(kù)資源 connect = openDatabase() defer connect.close() //其他代碼 //連接的數(shù)據(jù)庫(kù)還是可以使用的 }
- 在golang編程中的通常的做法是,創(chuàng)建資源后,比如(打開(kāi)了文件,獲取了數(shù)據(jù)庫(kù)連接或者時(shí)鎖等資源)可以執(zhí)行
defer
語(yǔ)句來(lái)進(jìn)行關(guān)閉(函數(shù)執(zhí)行完后才從獨(dú)立的棧中釋放關(guān)閉資源) - 在
defer
后可以繼續(xù)使用創(chuàng)建的資源 - 當(dāng)函數(shù)執(zhí)行完后,系統(tǒng)會(huì)依次從這個(gè)獨(dú)立的棧中取出語(yǔ)句或關(guān)閉資源
到此這篇關(guān)于GO語(yǔ)言延遲函數(shù)defer用法詳解的文章就介紹到這了,更多相關(guān)GO defer延遲函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- golang 定時(shí)任務(wù)方面time.Sleep和time.Tick的優(yōu)劣對(duì)比分析
- 詳解golang 定時(shí)任務(wù)time.Sleep和time.Tick實(shí)現(xiàn)結(jié)果比較
- go?time.Sleep睡眠指定時(shí)間實(shí)例詳解(小時(shí)級(jí)到納秒級(jí))
- Golang time.Sleep()用法及示例講解
- Golang關(guān)鍵字defer的用法詳解
- 超全講解Golang中defer關(guān)鍵字的用法
- Go關(guān)鍵字defer的使用和底層實(shí)現(xiàn)
- Go語(yǔ)言中defer使用的陷阱小結(jié)
- Go defer與time.sleep的使用與區(qū)別
相關(guān)文章
Go語(yǔ)言實(shí)戰(zhàn)之詳細(xì)掌握正則表達(dá)式的應(yīng)用與技巧
正則表達(dá)式是一種從左到右與主題字符串匹配的模式,正則表達(dá)式用于替換字符串中的文本,驗(yàn)證表單,基于模式匹配從字符串中提取子字符串等等,這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言實(shí)戰(zhàn)之詳細(xì)掌握正則表達(dá)式的應(yīng)用與技巧,需要的朋友可以參考下2023-12-12golang?Gin上傳文件返回前端及中間件實(shí)現(xiàn)示例
這篇文章主要為大家介紹了golang?Gin上傳文件返回前端及中間件實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04golang開(kāi)發(fā)微框架Gin的安裝測(cè)試及簡(jiǎn)介
這篇文章主要為大家介紹了golang微框架Gin的安裝測(cè)試及簡(jiǎn)介,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-11-11golang 實(shí)現(xiàn)一個(gè)負(fù)載均衡案例(隨機(jī),輪訓(xùn))
這篇文章主要介紹了golang 實(shí)現(xiàn)一個(gè)負(fù)載均衡案例(隨機(jī)、輪訓(xùn)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04Golang?動(dòng)態(tài)腳本調(diào)研詳解
這篇文章主要為大家介紹了Golang?動(dòng)態(tài)腳本調(diào)研詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09go-zero熔斷機(jī)制組件Breaker接口定義使用解析
這篇文章主要為大家介紹了go-zero熔斷機(jī)制組件Breaker接口定義使用解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05golang結(jié)構(gòu)體與json格式串實(shí)例代碼
本文通過(guò)實(shí)例代碼給大家介紹了golang結(jié)構(gòu)體與json格式串的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-10-10Go語(yǔ)言實(shí)現(xiàn)JSON解析的方法詳解
在日常項(xiàng)目中,使用Json格式進(jìn)行數(shù)據(jù)封裝是比較常見(jiàn)的操作。本文將詳細(xì)講解如何利用Go語(yǔ)言實(shí)現(xiàn)JSON的解析,感興趣的小伙伴可以學(xué)習(xí)一下2022-04-04