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