golang init方法和main方法初始化順序
init()和main()方法是golang預設的兩個方法,不需要我們呼叫,程式執行會自動尋找專案中的這倆方法。現在我們就講一種通用的情況:
main 包下 匯入了 init2 包而在init2 包下又匯入了init3 包,三個包下都有自己的init 方法,初始化的順序又是怎麼的呢?
先看一段程式碼:
// demo_init1.go package main import "golang_thinking/src/article_init/init2" import "fmt" var VariableMain = "variable_main" const ConstantMain = "constant_main" func init() { fmt.Printf("ConstantMain is %s \n",ConstantMain) fmt.Printf("VariableMain is %s \n", VariableMain) } func main() { fmt.Print("execute main method...\n") init2.Init2() }
程式不會先初始化demo_init1.go 裡的,常量,變數,init() ,而是先會初始化init2包
demo_init2.go 程式碼如下:
// demo_init2.go package init2 import "fmt" import "golang_thinking/src/article_init/init3" var VariableInit2 = "init2_variable" const ConstantInit2 = "init2_constant" func init() { fmt.Printf("ConstantInit2 is %s \n",ConstantInit2) fmt.Printf("VariableInit2 is %s \n",VariableInit2) } func Init2(){ fmt.Print("Init2 method... \n") init3.Init3() }
同時又引入了init3包,包內檔案demo_init3.go 程式碼如下:
// demo_init3.go package init3 import "fmt" var VariableInit3 = "variable_init3" const ConstantInit3 = "constant_init3" func init() { fmt.Printf("VariableInit3 is %s \n",VariableInit3) fmt.Printf("ConstantInit3 is %s \n",ConstantInit3) } func init() { fmt.Printf("一個包中最好只出現一個init方法\n") } func Init3(){ fmt.Print("Init3 method...\n") }
最後貼出控制檯的列印:

10.jpg
分析:先分析輸出的中文:“一個包中最好只出現一個init方法”,這是demo_init3.go 的第二個init()方法裡輸出的內容,要說明的是,同一個包下可以有多個init方法,按init出現的順序初始化,但是建議還是一個init為好;
從列印的順序可以看出,是先初始化init3包下的init(),然後是init2包下init()方法,最後是main包下的init()方法。
最後初始化順序總結下:開始是先在main包下,如果引入了其他包,就跳到其他包下初始化常量,變數,init()方法,如果又引入了其他包就又優先再其他包下按這個順序初始化,以此類推。還要說明的是,如果匯入的兩個包中又都引入的第三個包,第三個包不會初始化兩次,只會一次。
程式碼地址: ofollow,noindex">https://github.com/wjsoho/golang_thinking/tree/master/src/article_init