go?defer延遲調(diào)用的使用場(chǎng)景示例詳解
defer 簡(jiǎn)介
defer 通俗來講就是延遲調(diào)用。defer 會(huì)在當(dāng)前函數(shù)返回之前執(zhí)行 defer 注冊(cè)的函數(shù)。
例如: defer func_x()
這樣語句會(huì)讓你注冊(cè)一個(gè)函數(shù)變量到 defer 的全局鏈表中,在 defer 語句所在的函數(shù)退出之前調(diào)用。
主要使用場(chǎng)景
panic 場(chǎng)景:這個(gè)是重要的一個(gè)特性,通常能簡(jiǎn)化我們的代碼,確保無論任何場(chǎng)景,defer 的函數(shù)一定調(diào)用,通常用在鎖或者資源的釋放場(chǎng)景較多;
配套的兩個(gè)行為代碼可以放在最近的位置:創(chuàng)建&釋放、加鎖&放鎖、前置&后置,使得代碼更易讀,編程體驗(yàn)優(yōu)秀。最近的地方是哪里?下一行
延遲調(diào)用
package main func main() { defer println("--- defer ---") println("--- end ---") }
defer 會(huì)在main函數(shù)之前調(diào)用。
核心要點(diǎn):
延遲調(diào)用:defer 語句本身雖然是 main 的第一行,但是 fmt.Println 是先打印的;
defer 關(guān)鍵字一定是處于函數(shù)上下文:defer 必須放在函數(shù)內(nèi)部
LIFO
一個(gè)函數(shù)內(nèi)有多個(gè)defer時(shí),壓棧式執(zhí)行,后入先出。
package main import "fmt" func main() { defer func() { fmt.Println("1") }() defer func() { fmt.Println("2") }() }
異常場(chǎng)景
注意:一定要先注冊(cè)defer,放在函數(shù)第一行,放到如下代碼return之前,是無法捕獲異常的;
package main import "fmt" func main() { defer func() { if err := recover(); err != nil { fmt.Println("捕獲panic", err) } }() var sliceOne []int sliceOne[0] = 1 return }
以上就是go defer 延遲調(diào)用的詳細(xì)內(nèi)容,更多關(guān)于go defer 延遲調(diào)用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用golang實(shí)現(xiàn)一個(gè)MapReduce的示例代碼
這篇文章主要給大家介紹了關(guān)于如何使用golang實(shí)現(xiàn)一個(gè)MapReduce,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09Go檢查結(jié)構(gòu)體中是否存在某個(gè)字段及創(chuàng)建結(jié)構(gòu)體切片或映射
這篇文章主要為大家介紹了Go檢查結(jié)構(gòu)體中是否存在某個(gè)字段及創(chuàng)建結(jié)構(gòu)體切片或映射實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01gin自定義中間件解決requestBody不可重讀(請(qǐng)求體取值)
這篇文章主要介紹了gin自定義中間件解決requestBody不可重讀,確??刂破髂軌颢@取請(qǐng)求體值,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10詳解Golang利用反射reflect動(dòng)態(tài)調(diào)用方法
這篇文章主要介紹了詳解Golang利用反射reflect動(dòng)態(tài)調(diào)用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11