Go中init()執(zhí)行順序詳解
概述
init()
一般用來做一些初始化工作, go允許定義多個init()
,根據(jù)init()
重復(fù)場景不同,可以分為
- 同文件 單文件中定義多個
init()
- 同模塊 同模塊下不同文件中定義了多個
init()
- 子模塊 本模塊和子模塊都包含
init()
- 跨模塊 多個被引用模塊中均含
init()
要點秘訣:
- 涉及引用時,先加載的先執(zhí)行
- 同一文件中,先定義的先執(zhí)行
init()函數(shù)
init()
函數(shù)沒有參數(shù),也沒有返回值。
init()
函數(shù)在程序運行時,自動自動被調(diào)用執(zhí)行,不能在代碼中主動調(diào)用它。
init()函數(shù)執(zhí)行順序和時機 執(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.
可見就目前三者來講順序如下:
全局變量 -> init() -> main()
執(zhí)行時機
Go
語言程序啟動會先從main
包檢查其導(dǎo)入的所有包 ,每個包又可能導(dǎo)入了其他的包,由此Go
編譯器由此構(gòu)建出一個樹狀的包引用關(guān)系,再根據(jù)引用順序決定編譯順序,依次編譯這些包的代碼。
具體:
1. main引用的同級包,按引用順序依次編譯
2.包中再引用包,最底層的葉子節(jié)點的init()先編譯,依次往上調(diào)用
即,在運行啟動時,最后導(dǎo)入的包會最先初始化并調(diào)用其init()
函數(shù),
到此這篇關(guān)于Go中init()執(zhí)行順序分析的文章就介紹到這了,更多相關(guān)Go中init()執(zhí)行順序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang使用gzip壓縮字符減少redis等存儲占用的實現(xiàn)
本文主要介紹了Golang使用gzip壓縮字符減少redis等存儲占用的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01Go結(jié)合JavaScript實現(xiàn)抓取網(wǎng)頁中的圖像鏈接
這篇文章主要為大家詳細(xì)介紹了Go語言如何結(jié)合JavaScript實現(xiàn)抓取網(wǎng)頁中的圖像鏈接,文中的示例代碼講解詳細(xì),有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11