go?defer延遲調(diào)用的使用場景示例詳解
defer 簡介
defer 通俗來講就是延遲調(diào)用。defer 會在當(dāng)前函數(shù)返回之前執(zhí)行 defer 注冊的函數(shù)。
例如: defer func_x() 這樣語句會讓你注冊一個函數(shù)變量到 defer 的全局鏈表中,在 defer 語句所在的函數(shù)退出之前調(diào)用。
主要使用場景
panic 場景:這個是重要的一個特性,通常能簡化我們的代碼,確保無論任何場景,defer 的函數(shù)一定調(diào)用,通常用在鎖或者資源的釋放場景較多;
配套的兩個行為代碼可以放在最近的位置:創(chuàng)建&釋放、加鎖&放鎖、前置&后置,使得代碼更易讀,編程體驗優(yōu)秀。最近的地方是哪里?下一行
延遲調(diào)用
package main
func main() {
defer println("--- defer ---")
println("--- end ---")
}defer 會在main函數(shù)之前調(diào)用。
核心要點(diǎn):
延遲調(diào)用:defer 語句本身雖然是 main 的第一行,但是 fmt.Println 是先打印的;
defer 關(guān)鍵字一定是處于函數(shù)上下文:defer 必須放在函數(shù)內(nèi)部
LIFO
一個函數(shù)內(nèi)有多個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 延遲調(diào)用的詳細(xì)內(nèi)容,更多關(guān)于go defer 延遲調(diào)用的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go1.18新特性使用Generics泛型進(jìn)行流式處理
這篇文章主要為大家介紹了Go1.18新特性使用Generics泛型進(jìn)行流式處理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Windows環(huán)境下vscode-go安裝筆記(不支持32位)
這篇文章主要介紹了Windows環(huán)境下vscode-go安裝筆記(不支持32位),需要的朋友可以參考下2017-02-02
golang如何使用gos7讀取S7200Smart數(shù)據(jù)
文章介紹了如何使用Golang語言的Gos7工具庫讀取西門子S7200Smart系列PLC的數(shù)據(jù),通過指定數(shù)據(jù)塊號、起始字節(jié)偏移量和數(shù)據(jù)長度,可以精確讀取所需的數(shù)據(jù),感興趣的朋友跟隨小編一起看看吧2024-12-12

