Go語言中init函數(shù)和defer延遲調(diào)用關(guān)鍵詞詳解
Go語言中init函數(shù)和defer延遲調(diào)用關(guān)鍵詞
golang里面有兩個(gè)保留函數(shù)
main 函數(shù)(只能應(yīng)用于package main)
init 函數(shù)(能夠應(yīng)用于所有的package)
go程序會(huì)自動(dòng)調(diào)用 init()和main() 所以你不能在任何地方調(diào)用這兩個(gè)函數(shù)
package main 必須包含一個(gè)main 函數(shù),但是每個(gè)package中的init函數(shù)都是可選的
一個(gè)package 里可以寫多個(gè)init函數(shù),建議每個(gè)包中只寫一個(gè)init函數(shù)
單個(gè)包中代碼執(zhí)行順序如下
main包 --> 常量 -->全局變量 --> init函數(shù) --> main函數(shù) -->exit
多個(gè)包之間的代碼執(zhí)行順序
先按層級(jí)import 包,從最后引入包中加載常量、變量、init(),返回上級(jí)包 繼續(xù)執(zhí)行 加載常量、變量、init()
defer關(guān)鍵字,延遲調(diào)用
go語言中沒有其他面向?qū)ο蟮奈鰳?gòu)函數(shù),但是go語言提供了defer語句用于實(shí)現(xiàn)其他面向?qū)ο笳Z言的析構(gòu)函數(shù)
defer常用于釋放資源、接觸鎖定以及錯(cuò)誤處理等
無論在函數(shù)內(nèi)什么地方注冊defer 語句,他都會(huì)在所屬函數(shù)執(zhí)行完畢后才會(huì)執(zhí)行,并且如果注冊了多個(gè)的defer語句,他們會(huì)按照后進(jìn)先出(先進(jìn)后出)得原則執(zhí)行,所以一些資源我們開后就可以注冊defer語句關(guān)閉。
package main import "fmt" func main(){ defer fmt.Println("我是第一個(gè)被注冊,最后被打印,因?yàn)閐efer先進(jìn)后出") fmt.Print("我先被打印") defer fmt.Println("我第二個(gè)被注冊,但是先被打印") }
補(bǔ)充:go語言中defer關(guān)鍵字(延遲調(diào)用)用法你會(huì)嗎
一.defer關(guān)鍵字介紹:
Go語言中的defer語句會(huì)將其后面跟隨的語句進(jìn)行延遲處理,在defer歸屬的函數(shù)(如main函數(shù))即將返回時(shí)(即函數(shù)快結(jié)束),將延遲處理的語句按defer定義的逆序進(jìn)行執(zhí)行,也就是說,先被defer的語句最后被執(zhí)行,最后被defer的語句最先執(zhí)行
看代碼如下呢:
package main import "fmt" // Go語言中的defer語句會(huì)將其后面跟隨的語句進(jìn)行延遲處理 // 在defer歸屬的函數(shù)(如main函數(shù))即將返回時(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...") }
而這是運(yùn)行結(jié)果:
start...
stop...
3
2
1
可以看出,start...和stop...先被輸出,然后是3 2 1,即Go語言中的defer語句會(huì)將其后面跟隨的語句進(jìn)行延遲處理,在defer歸屬的函數(shù)(如main函數(shù))即將返回時(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é)合其他庫來更好地實(shí)現(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實(shí)現(xiàn)查詢json數(shù)據(jù)
這篇文章主要為大家介紹了go語言搬磚之go jmespath實(shí)現(xiàn)查詢json數(shù)據(jù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06