Go中init()執(zhí)行順序詳解
概述
init()
一般用來(lái)做一些初始化工作, go允許定義多個(gè)init()
,根據(jù)init()
重復(fù)場(chǎng)景不同,可以分為
- 同文件 單文件中定義多個(gè)
init()
- 同模塊 同模塊下不同文件中定義了多個(gè)
init()
- 子模塊 本模塊和子模塊都包含
init()
- 跨模塊 多個(gè)被引用模塊中均含
init()
要點(diǎn)秘訣:
- 涉及引用時(shí),先加載的先執(zhí)行
- 同一文件中,先定義的先執(zhí)行
init()函數(shù)
init()
函數(shù)沒(méi)有參數(shù),也沒(méi)有返回值。
init()
函數(shù)在程序運(yùn)行時(shí),自動(dòng)自動(dòng)被調(diào)用執(zhí)行,不能在代碼中主動(dòng)調(diào)用它。
init()函數(shù)執(zhí)行順序和時(shí)機(jī) 執(zhí)行順序
先看一段執(zhí)行代碼:
package main import "fmt" var x int8 = 5 const name = "Vitalik" func init() { fmt.Println(x) } func main() { fmt.Println("Eth merge") }
輸出結(jié)果:
5
Eth merge
Exiting.
可見(jiàn)就目前三者來(lái)講順序如下:
全局變量 -> init() -> main()
執(zhí)行時(shí)機(jī)
Go
語(yǔ)言程序啟動(dòng)會(huì)先從main
包檢查其導(dǎo)入的所有包 ,每個(gè)包又可能導(dǎo)入了其他的包,由此Go
編譯器由此構(gòu)建出一個(gè)樹(shù)狀的包引用關(guān)系,再根據(jù)引用順序決定編譯順序,依次編譯這些包的代碼。
具體:
1. main引用的同級(jí)包,按引用順序依次編譯
2.包中再引用包,最底層的葉子節(jié)點(diǎn)的init()先編譯,依次往上調(diào)用
即,在運(yùn)行啟動(dòng)時(shí),最后導(dǎo)入的包會(huì)最先初始化并調(diào)用其init()
函數(shù),
到此這篇關(guān)于Go中init()執(zhí)行順序分析的文章就介紹到這了,更多相關(guān)Go中init()執(zhí)行順序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
分析Go錯(cuò)誤處理優(yōu)化go?recover機(jī)制缺陷
這篇文章主要為大家介紹了分析Go錯(cuò)誤處理優(yōu)化go?recover機(jī)制缺陷示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07Go Asynq異步任務(wù)處理的實(shí)現(xiàn)
Asynq是一個(gè)新興的異步任務(wù)處理解決方案,它提供了輕量級(jí)的、易于使用的API,本文主要介紹了Go Asynq異步任務(wù)處理的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-06-06Golang使用gzip壓縮字符減少redis等存儲(chǔ)占用的實(shí)現(xiàn)
本文主要介紹了Golang使用gzip壓縮字符減少redis等存儲(chǔ)占用的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01Go結(jié)合JavaScript實(shí)現(xiàn)抓取網(wǎng)頁(yè)中的圖像鏈接
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言如何結(jié)合JavaScript實(shí)現(xiàn)抓取網(wǎng)頁(yè)中的圖像鏈接,文中的示例代碼講解詳細(xì),有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11手把手帶你走進(jìn)Go語(yǔ)言之運(yùn)算符解析
這篇文章主要介紹了手Go語(yǔ)言之運(yùn)算符解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09Golang基于文件魔數(shù)判斷文件類(lèi)型的案例代碼
這篇文章主要介紹了Golang基于文件魔數(shù)判斷文件類(lèi)型,本文介紹了基于文件魔數(shù)判斷文件類(lèi)型的方法,主要涉及如何ReadSeek讀取文件指定字節(jié)內(nèi)容,然后介紹文件魔數(shù),最后給出示例基于魔數(shù)判斷文件類(lèi)型,需要的朋友可以參考下2023-02-02如何避免Go語(yǔ)言常見(jiàn)錯(cuò)誤之意外的變量隱藏
在Go語(yǔ)言中,變量隱藏(Variable Shadowing)是一個(gè)常見(jiàn)的錯(cuò)誤來(lái)源,變量隱藏發(fā)生在一個(gè)內(nèi)部作用域中聲明的變量與外部作用域的變量同名時(shí),這可能導(dǎo)致開(kāi)發(fā)者無(wú)意中使用了錯(cuò)誤的變量,造成難以追蹤的bug,本文講解一些關(guān)于變量隱藏的常見(jiàn)錯(cuò)誤和如何避免它們的方法2024-01-01