Go語(yǔ)言中init函數(shù)和defer延遲調(diào)用關(guān)鍵詞詳解
Go語(yǔ)言中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 里可以寫(xiě)多個(gè)init函數(shù),建議每個(gè)包中只寫(xiě)一個(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語(yǔ)言中沒(méi)有其他面向?qū)ο蟮奈鰳?gòu)函數(shù),但是go語(yǔ)言提供了defer語(yǔ)句用于實(shí)現(xiàn)其他面向?qū)ο笳Z(yǔ)言的析構(gòu)函數(shù)
defer常用于釋放資源、接觸鎖定以及錯(cuò)誤處理等
無(wú)論在函數(shù)內(nèi)什么地方注冊(cè)defer 語(yǔ)句,他都會(huì)在所屬函數(shù)執(zhí)行完畢后才會(huì)執(zhí)行,并且如果注冊(cè)了多個(gè)的defer語(yǔ)句,他們會(huì)按照后進(jìn)先出(先進(jìn)后出)得原則執(zhí)行,所以一些資源我們開(kāi)后就可以注冊(cè)defer語(yǔ)句關(guān)閉。
package main
import "fmt"
func main(){
defer fmt.Println("我是第一個(gè)被注冊(cè),最后被打印,因?yàn)閐efer先進(jìn)后出")
fmt.Print("我先被打印")
defer fmt.Println("我第二個(gè)被注冊(cè),但是先被打印")
}補(bǔ)充:go語(yǔ)言中defer關(guān)鍵字(延遲調(diào)用)用法你會(huì)嗎
一.defer關(guān)鍵字介紹:
Go語(yǔ)言中的defer語(yǔ)句會(huì)將其后面跟隨的語(yǔ)句進(jìn)行延遲處理,在defer歸屬的函數(shù)(如main函數(shù))即將返回時(shí)(即函數(shù)快結(jié)束),將延遲處理的語(yǔ)句按defer定義的逆序進(jìn)行執(zhí)行,也就是說(shuō),先被defer的語(yǔ)句最后被執(zhí)行,最后被defer的語(yǔ)句最先執(zhí)行
看代碼如下呢:
package main
import "fmt"
// Go語(yǔ)言中的defer語(yǔ)句會(huì)將其后面跟隨的語(yǔ)句進(jìn)行延遲處理
// 在defer歸屬的函數(shù)(如main函數(shù))即將返回時(shí)(即函數(shù)快結(jié)束),將延遲處理的語(yǔ)句按defer定義的逆序進(jìn)行執(zhí)行
// 也就是說(shuō),先被defer的語(yǔ)句最后被執(zhí)行,最后被defer的語(yǔ)句最先執(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語(yǔ)言中的defer語(yǔ)句會(huì)將其后面跟隨的語(yǔ)句進(jìn)行延遲處理,在defer歸屬的函數(shù)(如main函數(shù))即將返回時(shí)(即函數(shù)快結(jié)束),將延遲處理的語(yǔ)句按defer定義的逆序進(jìn)行執(zhí)行,也就是說(shuō),先被defer的語(yǔ)句最后被執(zhí)行,最后被defer的語(yǔ)句最先執(zhí)行
到此這篇關(guān)于Go語(yǔ)言中init函數(shù)和defer延遲調(diào)用關(guān)鍵詞的文章就介紹到這了,更多相關(guān)go init函數(shù)和defer延遲調(diào)用關(guān)鍵詞內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go開(kāi)源Hugo站點(diǎn)構(gòu)建三步曲之集結(jié)渲染
這篇文章主要為大家介紹了go開(kāi)源Hugo站點(diǎn)構(gòu)建三步曲之集結(jié)渲染詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
深入解析Go語(yǔ)言中上下文超時(shí)與子進(jìn)程管理
這篇文章小編將通過(guò)一個(gè)實(shí)際問(wèn)題的案例,和大家深入探討一下Go語(yǔ)言中的上下文超時(shí)和子進(jìn)程管理,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10
golang?chan傳遞數(shù)據(jù)的性能開(kāi)銷詳解
這篇文章主要為大家詳細(xì)介紹了Golang中chan在接收和發(fā)送數(shù)據(jù)時(shí)因?yàn)椤皬?fù)制”而產(chǎn)生的開(kāi)銷,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2024-01-01
GoFrame實(shí)現(xiàn)順序性校驗(yàn)示例詳解
這篇文章主要為大家介紹了GoFrame實(shí)現(xiàn)順序性校驗(yàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
詳解Go語(yǔ)言strconv與其他基本數(shù)據(jù)類型轉(zhuǎn)換函數(shù)的使用
這篇文章將以 string 類型為中心,通過(guò) strconv 標(biāo)準(zhǔn)庫(kù),介紹其與其他基本數(shù)據(jù)類型相互轉(zhuǎn)換的函數(shù)。文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-12-12
golang(gin)的全局統(tǒng)一異常處理方式,并統(tǒng)一返回json
這篇文章主要介紹了golang(gin)的全局統(tǒng)一異常處理方式,并統(tǒng)一返回json,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
關(guān)于Golang的Map的線程安全問(wèn)題的解決方案
在?Golang?編程中,map?是一種常用的數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)鍵值對(duì),然而,Golang?的?map?在并發(fā)訪問(wèn)時(shí)是線程不安全的,本文將詳細(xì)介紹?Golang?中?map?的線程不安全性,并提供一些解決方案,幫助開(kāi)發(fā)者在并發(fā)編程中正確使用?map,需要的朋友可以參考下2024-11-11

