golang中defer的基本使用教程
前言
第一次看go基礎(chǔ)語法的時候,用使用到了defer。但是一直不知道它到底是什么,有什么用途。這幾天通過查詢、學(xué)習(xí)。算是對defer有了一點(diǎn)淺顯的認(rèn)識。
1.什么是defer
defer是go中一種延遲調(diào)用機(jī)制,defer后面的函數(shù)只有在當(dāng)前函數(shù)執(zhí)行完畢后才能執(zhí)行,通常用于釋放資源。
2.defer的特點(diǎn)
defer遵循先進(jìn)后出的原則,類似于棧的結(jié)構(gòu)。
補(bǔ)充下:為什么要把defer設(shè)計成這種機(jī)制?
因?yàn)楹笊暾埖馁Y源和可能對前面申請的資源有依賴。如果先將前面申請的資源釋放掉了。對于后面的資源可能會造成影響。所以先釋放后申請的資源,再釋放前面申請的資源。
3.defer什么時間執(zhí)行
前面說到,defer只有在當(dāng)前函數(shù)執(zhí)行完畢后,才會執(zhí)行。其實(shí)不太準(zhǔn)確。
go中的return語句并不是原子性操作,一般是分為兩步:
- 將返回值賦值給一個變量
- 執(zhí)行RET指令
defer就執(zhí)行在1之后,2之前。
4.defer常見的坑
1.輸出是多少?
x := 10 defer func(a int) { fmt.Println(a) }(x) x++
答案:
為什么?
因?yàn)閐efer后面的函數(shù)在入棧的時候保存的是入棧那一刻的值,而當(dāng)時x的值是10,所以后期對x修改,并不會影響棧內(nèi)函數(shù)的值。
2.輸出多少
x := 10 defer func(a *int) { fmt.Println(*a) }(&x) x++
答案:
為什么?
這里defer后面函數(shù)入棧的時候存入的執(zhí)行變量x的指針。所以,后期x值改變的時候,輸出結(jié)果也會改變。
3.輸出多少
func test()(x int) { x = 10 defer func() { x++ }() return x }
答案:
為什么?
之前我們說過,return并不是原子性操作,是通過一個變量賦值和ret指令來完成的。
而上述例子中,是具名函數(shù)。即返回值帶有名字。這樣我們在執(zhí)行defer的時候相當(dāng)于修改了返回值的值。所以為11
看到這里,博主想到了閉包。和閉包有沒有關(guān)系呢?
4.輸出什么
func test1() int { x := 10 defer func() { x++ }() // ans = x // -------- defer x = x+1 // return x return x }
答案:
為什么?
還是return語句的原因,博主已經(jīng)在代碼中給出提示??梢?非具名函數(shù)不會受到相應(yīng)的影響。
對于defer暫時理解了這些,下次再見。
總結(jié)
到此這篇關(guān)于golang中defer基本使用的文章就介紹到這了,更多相關(guān)go defer使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang實(shí)現(xiàn)實(shí)時監(jiān)聽文件并自動切換目錄
這篇文章主要給大家介紹了golang實(shí)現(xiàn)實(shí)時監(jiān)聽文件,并自動切換目錄,文中通過代碼示例給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的參考價值,需要的朋友可以參考下2023-12-12解決Goland 提示 Unresolved reference 錯誤的問題
這篇文章主要介紹了解決Goland 提示 Unresolved reference 錯誤的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12golang將多路復(fù)異步io轉(zhuǎn)成阻塞io的方法詳解
常見的IO模型有阻塞、非阻塞、IO多路復(fù)用,異,下面這篇文章主要給大家介紹了關(guān)于golang將多路復(fù)異步io轉(zhuǎn)成阻塞io的方法,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09go語言中GOPATH GOROOT的作用和設(shè)置方式
這篇文章主要介紹了go語言中GOPATH GOROOT的作用和設(shè)置方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05golang連接kafka消費(fèi)進(jìn)ES操作
這篇文章主要介紹了golang連接kafka消費(fèi)進(jìn)ES操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12基于微服務(wù)框架go-micro開發(fā)gRPC應(yīng)用程序
這篇文章介紹了基于微服務(wù)框架go-micro開發(fā)gRPC應(yīng)用程序的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07