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語句,他們會按照后進先出(先進后出)得原則執(zhí)行,所以一些資源我們開后就可以注冊defer語句關(guān)閉。
package main
import "fmt"
func main(){
defer fmt.Println("我是第一個被注冊,最后被打印,因為defer先進后出")
fmt.Print("我先被打印")
defer fmt.Println("我第二個被注冊,但是先被打印")
}補充:go語言中defer關(guān)鍵字(延遲調(diào)用)用法你會嗎
一.defer關(guān)鍵字介紹:
Go語言中的defer語句會將其后面跟隨的語句進行延遲處理,在defer歸屬的函數(shù)(如main函數(shù))即將返回時(即函數(shù)快結(jié)束),將延遲處理的語句按defer定義的逆序進行執(zhí)行,也就是說,先被defer的語句最后被執(zhí)行,最后被defer的語句最先執(zhí)行
看代碼如下呢:
package main
import "fmt"
// Go語言中的defer語句會將其后面跟隨的語句進行延遲處理
// 在defer歸屬的函數(shù)(如main函數(shù))即將返回時(即函數(shù)快結(jié)束),將延遲處理的語句按defer定義的逆序進行執(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語句會將其后面跟隨的語句進行延遲處理,在defer歸屬的函數(shù)(如main函數(shù))即將返回時(即函數(shù)快結(jié)束),將延遲處理的語句按defer定義的逆序進行執(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)文章
go開源Hugo站點構(gòu)建三步曲之集結(jié)渲染
這篇文章主要為大家介紹了go開源Hugo站點構(gòu)建三步曲之集結(jié)渲染詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02
golang?chan傳遞數(shù)據(jù)的性能開銷詳解
這篇文章主要為大家詳細介紹了Golang中chan在接收和發(fā)送數(shù)據(jù)時因為“復(fù)制”而產(chǎn)生的開銷,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下2024-01-01
詳解Go語言strconv與其他基本數(shù)據(jù)類型轉(zhuǎn)換函數(shù)的使用
這篇文章將以 string 類型為中心,通過 strconv 標準庫,介紹其與其他基本數(shù)據(jù)類型相互轉(zhuǎn)換的函數(shù)。文中的示例代碼講解詳細,感興趣的可以了解一下2022-12-12
golang(gin)的全局統(tǒng)一異常處理方式,并統(tǒng)一返回json
這篇文章主要介紹了golang(gin)的全局統(tǒng)一異常處理方式,并統(tǒng)一返回json,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
關(guān)于Golang的Map的線程安全問題的解決方案
在?Golang?編程中,map?是一種常用的數(shù)據(jù)結(jié)構(gòu),用于存儲鍵值對,然而,Golang?的?map?在并發(fā)訪問時是線程不安全的,本文將詳細介紹?Golang?中?map?的線程不安全性,并提供一些解決方案,幫助開發(fā)者在并發(fā)編程中正確使用?map,需要的朋友可以參考下2024-11-11

