在一個 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 函式,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/5014.html
標籤:Go
