init()和main()方法是golang預設的兩個方法,不需要我們調用,程式執行會自動尋找項目中的這倆方法。現在我們就講一種通用的情況:
main 包下 導入了 init2 包而在init2 包下又導入了init3 包,三個包下都有自己的init 方法,初始化的順序又是怎麼的呢?
先看一段代碼:
程式不會先初始化demo_init1.go 裡的,常量,變量,init() ,而是先會初始化init2包
demo_init2.go 代碼如下:
同時又引入了init3包,包内檔案demo_init3.go 代碼如下:
最後貼出控制台的列印:
10.jpg
分析:先分析輸出的中文:“一個包中最好隻出現一個init方法”,這是demo_init3.go 的第二個init()方法裡輸出的内容,要說明的是,同一個包下可以有多個init方法,按init出現的順序初始化,但是建議還是一個init為好;
從列印的順序可以看出,是先初始化init3包下的init(),然後是init2包下init()方法,最後是main包下的init()方法。
最後初始化順序總結下:開始是先在main包下,如果引入了其他包,就跳到其他包下初始化常量,變量,init()方法,如果又引入了其他包就又優先再其他包下按這個順序初始化,以此類推。還要說明的是,如果導入的兩個包中又都引入的第三個包,第三個包不會初始化兩次,隻會一次。
代碼位址:https://github.com/wjsoho/golang_thinking/tree/master/src/article_init