在一個 go 程式中通常包含:包、常量、變數、init()、main()等元素,如果同時存在多個包,包之間存在依賴關係,每個包中存在多個 init 函數,每個文件中存在多個 init 函數。 包的執行順序 在 main 包中的 go 文件預設總是會被執行 同包下的不同 go 文件,按照文件名“從小到 ...
在一個 go 程式中通常包含:包、常量、變數、init()、main()等元素,如果同時存在多個包,包之間存在依賴關係,每個包中存在多個 init 函數,每個文件中存在多個 init 函數。
包的執行順序
- 在 main 包中的 go 文件預設總是會被執行
- 同包下的不同 go 文件,按照文件名“從小到大”排序順序執行
- 其他的包只有被 main 包 import 才會執行,按照 import 的先後順序執行
- 被遞歸 import 的包的初始化順序與 import 順序相反,例如:導入順序 main –> A –> B –> C,則初始化順序為 C –> B –> A –> main
- 一個包被其它多個包 import,但只能被初始化一次
- main 包總是被最後一個初始化,因為它總是依賴別的包
- 避免出現迴圈 import,例如:A –> B –> C –> A
go 程式的初始化順序見下圖:
init 和 main 函數
init()、main() 是 go 語言中的保留函數,兩個函數在 go 語言中的區別如下:
相同點:
- 兩個函數在定義時不能有任何的參數和返回值
- 該函數只能由 go 程式自動調用,不可以被引用
不同點:
- init 可以應用於任意包中,且可以重覆定義多個。
- main 函數只能用於 main 包中,且只能定義一個。
兩個函數的執行順序:
- 對同一個 go 文件的 init( ) 調用順序是從上到下的
- 對同一個 package 中的不同文件,將文件名按字元串進行“從小到大”排序,之後順序調用各文件中的init()函數
- 對於不同的 package,如果不相互依賴的話,按照 main 包中 import 的順序調用其包中的 init() 函數
- 如果 package 存在依賴,調用順序為最後被依賴的最先被初始化,例如:導入順序 main –> A –> B –> C,則初始化順序為 C –> B –> A –> main,一次執行對應的 init 方法。
常量、變數、init()、main()
在同一個文件中,常量、變數、init()、main() 依次進行初始化。
init 順序
1、在同一個 package 中,可以多個文件中定義 init 方法
2、在同一個 go 文件中,可以重覆定義 init 方法
3、在同一個 package 中,不同文件中的 init 方法的執行按照文件名先後執行各個文件中的 init 方法
4、在同一個文件中的多個 init 方法,按照在代碼中編寫的順序依次執行不同的 init 方法
5、對於不同的 package,如果不相互依賴的話,按照 main 包中 import 的順序調用其包中的 init() 函數
6、如果 package 存在依賴,調用順序為最後被依賴的最先被初始化,例如:導入順序 main –> A –> B –> C,則初始化順序為 C –> B –> A –> main,一次執行對應的 init 方法。
所有 init 函數都在同⼀個 goroutine 內執⾏。
所有 init 函數結束後才會執⾏ main.main 函數。