Go語言中init函數(shù)和defer延遲調(diào)用關(guān)鍵詞詳解
Go語言中init函數(shù)和defer延遲調(diào)用關(guān)鍵詞
golang里面有兩個保留函數(shù)
main 函數(shù)(只能應(yīng)用于package main)
init 函數(shù)(能夠應(yīng)用于所有的package)
go程序會自動調(diào)用 init()和main() 所以你不能在任何地方調(diào)用這兩個函數(shù)
package main 必須包含一個main 函數(shù),但是每個package中的init函數(shù)都是可選的
一個package 里可以寫多個init函數(shù),建議每個包中只寫一個init函數(shù)
單個包中代碼執(zhí)行順序如下
main包 --> 常量 -->全局變量 --> init函數(shù) --> main函數(shù) -->exit
多個包之間的代碼執(zhí)行順序
先按層級import 包,從最后引入包中加載常量、變量、init(),返回上級包 繼續(xù)執(zhí)行 加載常量、變量、init()
defer關(guān)鍵字,延遲調(diào)用
go語言中沒有其他面向?qū)ο蟮奈鰳?gòu)函數(shù),但是go語言提供了defer語句用于實現(xiàn)其他面向?qū)ο笳Z言的析構(gòu)函數(shù)
defer常用于釋放資源、接觸鎖定以及錯誤處理等
無論在函數(shù)內(nèi)什么地方注冊defer 語句,他都會在所屬函數(shù)執(zhí)行完畢后才會執(zhí)行,并且如果注冊了多個的defer語句,他們會按照后進(jìn)先出(先進(jìn)后出)得原則執(zhí)行,所以一些資源我們開后就可以注冊defer語句關(guān)閉。
package main import "fmt" func main(){ defer fmt.Println("我是第一個被注冊,最后被打印,因為defer先進(jìn)后出") fmt.Print("我先被打印") defer fmt.Println("我第二個被注冊,但是先被打印") }
補充:go語言中defer關(guān)鍵字(延遲調(diào)用)用法你會嗎
一.defer關(guān)鍵字介紹:
Go語言中的defer語句會將其后面跟隨的語句進(jìn)行延遲處理,在defer歸屬的函數(shù)(如main函數(shù))即將返回時(即函數(shù)快結(jié)束),將延遲處理的語句按defer定義的逆序進(jìn)行執(zhí)行,也就是說,先被defer的語句最后被執(zhí)行,最后被defer的語句最先執(zhí)行
看代碼如下呢:
package main import "fmt" // Go語言中的defer語句會將其后面跟隨的語句進(jìn)行延遲處理 // 在defer歸屬的函數(shù)(如main函數(shù))即將返回時(即函數(shù)快結(jié)束),將延遲處理的語句按defer定義的逆序進(jìn)行執(zhí)行 // 也就是說,先被defer的語句最后被執(zhí)行,最后被defer的語句最先執(zhí)行 func main() { fmt.Println("start...") defer fmt.Println("1") defer fmt.Println("2") defer fmt.Println("3") fmt.Println("stop...") }
而這是運行結(jié)果:
start...
stop...
3
2
1
可以看出,start...和stop...先被輸出,然后是3 2 1,即Go語言中的defer語句會將其后面跟隨的語句進(jìn)行延遲處理,在defer歸屬的函數(shù)(如main函數(shù))即將返回時(即函數(shù)快結(jié)束),將延遲處理的語句按defer定義的逆序進(jìn)行執(zhí)行,也就是說,先被defer的語句最后被執(zhí)行,最后被defer的語句最先執(zhí)行
到此這篇關(guān)于Go語言中init函數(shù)和defer延遲調(diào)用關(guān)鍵詞的文章就介紹到這了,更多相關(guān)go init函數(shù)和defer延遲調(diào)用關(guān)鍵詞內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入理解Golang中的dig包管理和解決依賴關(guān)系
這篇文章主要為大家詳細(xì)介紹了golang中dig包的使用方法,探討其應(yīng)用場景,并提供一些示例,展示如何結(jié)合其他庫來更好地實現(xiàn)這些場景,感興趣的小伙伴可以了解下2024-01-01go使用makefile腳本編譯應(yīng)用的方法小結(jié)
makefile可以看作是make工具的腳本文件, 而make主要用來處理一系列命令。常用的比如用來編譯和打包文件, 在C/C++的編譯打包中應(yīng)用最廣泛了,這篇文章主要介紹了go使用makefile腳本編譯應(yīng)用,需要的朋友可以參考下2022-08-08go語言搬磚之go jmespath實現(xiàn)查詢json數(shù)據(jù)
這篇文章主要為大家介紹了go語言搬磚之go jmespath實現(xiàn)查詢json數(shù)據(jù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06