Go包初始化
回答
簡答:初始化只執行一次。
龍回答:引用的相關規範部分 - Program execution:
沒有進口數據包通過其全包級變量賦初值,然後調用任何數據包級的功能與名稱初始化並簽字
func init()
在其來源中定義。名稱爲
init
的程序包範圍或文件範圍標識符只能聲明爲具有此簽名的函數。即使在單個源文件中也可以定義多個這樣的函數;它們以未指定的順序執行。在一個包中,包級變量被初始化,並根據參考順序確定常量值:如果A的初始化因子取決於B,則A將在B之後被設置。依賴關係分析不依賴於正在初始化的項目的實際值,僅在源文件中出現。 A取決於B,如果A的值包含提到的B,包含一個初始化符提到B的值,或者遞歸地提到一個提到B的函數。如果這樣的依賴關係形成一個循環,這是一個錯誤。如果兩個項目不相互依賴,它們將按照它們出現在源代碼中的順序進行初始化,可能以多個文件的形式呈現給編譯器。由於依賴性分析每個包完成的,它可以產生未指定的結果,如果A的初始值設定調用引用B.
的
init
功能不能被稱爲從在程序中任何地方的另一包中定義的功能。特別是,不能明確調用init
,也不能將指向init
的指針指定給函數變量。如果包有導入,則在初始化包本身之前,導入的包將被初始化。如果多個軟件包導入一個軟件包P,則P只會初始化一次。
通過構造導入包可確保在初始化中不存在循環依賴關係。
一個完整的程序是通過將一個名爲的主包的單一未導入包與它所導入的所有包連接起來創建的。主包必須有包名稱
main
並聲明函數main
,它不接受任何參數並且不返回任何值。func main() { … }
程序執行通過初始化主包,然後調用函數
main
開始。當函數main
返回時,程序退出。它不會等待其他(非主要)goroutines完成。程序包初始化變量初始化和調用
init
函數 - 在單個goroutine中,按順序一次發生一個程序包。一個init
函數可能會啓動其他的goutoutine,它可以與初始化代碼同時運行。但是,初始化始終對init
函數進行排序:直到前一個返回,它纔會開始下一個init
。
- 1. 在Go中初始化結構
- 2. Go插件變量初始化
- 3. GO顯式數組初始化
- 4. Go中的靜態初始化?
- 5. 初始化包含文件
- 6. 原始類與包裝類初始化
- 7. 用數組或初始化初始化一個NSMutableArray初始化
- 8. 初始化,初始化與參數和便利初始化
- 9. java中的初始化初始化
- 10. 初始化在初始化列表
- 11. 直接初始化與值初始化
- 12. 初始化含有初始化列表
- 13. 值初始化vs集合初始化
- 14. C++ - 初始化與骨料初始化
- 15. 初始化內置類型初始化
- 16. 初始化數組時初始化System.AccessViolationException
- 17. Spring初始化bean初始化
- 18. 初始化UITableViewCell初始化問題initwithStyle
- 19. 如何初始化Go結構中的特定字段
- 20. 在Go如何初始化成員結構
- 21. 如何在Go中初始化組合結構?
- 22. 以動態方式初始化數組大小go
- 23. 如何初始化Go中的結構中的嵌套映射?
- 24. 如何防止Go中導出類型的初始化?
- 25. Go中的結構初始化和方法聲明
- 26. Golang初始化包內的訂單?
- 27. C++初始化包含數組
- 28. IAIK PKCS#11包裝初始化失敗
- 29. 初始化時獲取當前包名
- 30. 包對象何時初始化?