defer是什么?
在錫林浩特等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作按需定制設(shè)計,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),全網(wǎng)營銷推廣,成都外貿(mào)網(wǎng)站建設(shè),錫林浩特網(wǎng)站建設(shè)費(fèi)用合理。在Go語言中,可以使用關(guān)鍵字defer向函數(shù)注冊退出調(diào)用,即主函數(shù)退出時,defer后的函數(shù)才被調(diào)用。defer語句的作用是不管程序是否出現(xiàn)異常,均在函數(shù)退出時自動執(zhí)行相關(guān)代碼。
defer的用途
在函數(shù)中,程序員經(jīng)常需要創(chuàng)建資源(比如:數(shù)據(jù)庫連接、文件句柄、鎖等) ,為了在函數(shù)執(zhí)行完 畢后,及時的釋放資源,Go 的設(shè)計者提供 defer (延時機(jī)制)。
package main import "fmt" //defer 可以向函數(shù)注冊、退出調(diào)用,即當(dāng)主調(diào)函數(shù)退出時,defer后的函數(shù)才被調(diào)用, // defer語句的作用就是不管程序是否出現(xiàn)異常,均在函數(shù)退出是自動執(zhí)行相關(guān)代碼 func sum(n1 int,n2 int) int{ //當(dāng)執(zhí)行到defer時,暫時不執(zhí)行,會將defer后面的語句壓入到獨立的(defer棧) //當(dāng)函數(shù)執(zhí)行完畢后,再從defer棧 安裝先入后出的方式出棧執(zhí)行 //defer 將語句放入到棧時,也會將相關(guān)的值拷貝同時入棧*** defer fmt.Println("ok1 n1=",n1)//defer3 ok3 n1 20 defer fmt.Println("ok2 n2=",n2) //defer2 ok2 n2 10 //n1 ++ //n2 ++ res := n1 + n2 fmt.Println("ok3 res=",res)//1.ok1 return res } func main() { res :=sum(20,10) fmt.Println("res=",res) }
執(zhí)行結(jié)果
結(jié)果分析:
從執(zhí)行結(jié)果來看,res=30 是最先開始執(zhí)行的部分,接下來是第二個defer n2為10 最后執(zhí)行的是第一個defer n1為20 ,即當(dāng)執(zhí)行到defer時,暫時不執(zhí)行,會將defer后面的語句壓入到獨立的(defer棧),當(dāng)函數(shù)執(zhí)行完畢后,再從defer棧,按照(先入后出)的方式出棧執(zhí)行。
注意事項:
1) 當(dāng) go 執(zhí)行到一個 defer 時,不會立即執(zhí)行 defer 后的語句,而是將 defer 后的語句壓入到一個棧 中[我為了講課方便,暫時稱該棧為 defer 棧], 然后繼續(xù)執(zhí)行函數(shù)下一個語句。
2) 當(dāng)函數(shù)執(zhí)行完畢后,在從 defer 棧中,依次從棧頂取出語句執(zhí)行(注:遵守棧 先入后出的機(jī)制),
3) 在 defer 將語句放入到棧時,也會將相關(guān)的值拷貝同時入棧
package main import "fmt" //defer 可以向函數(shù)注冊、退出調(diào)用,即當(dāng)主調(diào)函數(shù)退出時,defer后的函數(shù)才被調(diào)用, // defer語句的作用就是不管程序是否出現(xiàn)異常,均在函數(shù)退出是自動執(zhí)行相關(guān)代碼 func sum(n1 int,n2 int) int{ //當(dāng)執(zhí)行到defer時,暫時不執(zhí)行,會將defer后面的語句壓入到獨立的(defer棧) //當(dāng)函數(shù)執(zhí)行完畢后,再從defer棧 安裝先入后出的方式出棧執(zhí)行 //defer 將語句放入到棧時,也會將相關(guān)的值拷貝同時入棧*** defer fmt.Println("ok1 n1=",n1)//defer3 ok3 n1 20 defer fmt.Println("ok2 n2=",n2) //defer2 ok2 n2 10 n1 ++ n2 ++ res := n1 + n2 fmt.Println("ok3 res=",res)//1.ok1 return res } func main() { res :=sum(20,10) fmt.Println("res=",res) }
執(zhí)行結(jié)果:
從結(jié)果看出n1++ ,n2++兩個的值未入相關(guān)defer的棧,即defer 將語句放入到棧時,也會將相關(guān)的值拷貝同時入棧。
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨有T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務(wù)器買多久送多久。
文章題目:Golang函數(shù)中defer的作用以及細(xì)節(jié)-創(chuàng)新互聯(lián)
URL分享:http://www.rwnh.cn/article8/jcoip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站、定制網(wǎng)站、網(wǎng)站收錄、搜索引擎優(yōu)化、企業(yè)網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容