- Go語言高級編程(第2版)
- 柴樹杉 曹春暉
- 466字
- 2025-08-07 17:56:15
1.5.4 初始化順序
Go程序的初始化和執(zhí)行總是從main.main()
函數(shù)開始的。但是如果main
包里導(dǎo)入了其他包,則會按照順序?qū)⑺鼈儼?code>main包里(這里的導(dǎo)入順序依賴具體實現(xiàn),一般可能是以文件名或包路徑名的字符串順序?qū)耄H绻硞€包被多次導(dǎo)入,那么在執(zhí)行的時候只會導(dǎo)入一次。當(dāng)一個包被導(dǎo)入時,如果它還導(dǎo)入了其他包,則先將其他包都包含進(jìn)來,然后創(chuàng)建和初始化這個包的常量和變量。再調(diào)用包里的init()
函數(shù),如果一個包有多個init()
函數(shù),實現(xiàn)可能是以文件名的順序調(diào)用,那么同一個文件內(nèi)的多個init()
是以出現(xiàn)的順序依次調(diào)用的(init()
不是普通函數(shù),可以定義多個,但是不能被其他函數(shù)調(diào)用)。最終,在main
包的所有包常量、包變量被創(chuàng)建和初始化,并且只有在init()
函數(shù)被執(zhí)行后,才會進(jìn)入main.main()
函數(shù),程序開始正常執(zhí)行。圖1-10展示了Go程序啟動時的包初始化流?程。

圖1-10 Go程序啟動時的包初始化流程
要注意的是,在main.main()
函數(shù)執(zhí)行之前,所有代碼都運行在同一個goroutine中,也是運行在程序的主系統(tǒng)線程中。如果某個init()
函數(shù)內(nèi)部用go
關(guān)鍵字啟動了新的goroutine,那么新的goroutine和main.main()
函數(shù)是并發(fā)執(zhí)行?的。
因為所有的init()
函數(shù)和main()
函數(shù)都是在主線程完成,它們也滿足順序一致性模?型。
- C#高級編程(第10版) C# 6 & .NET Core 1.0 (.NET開發(fā)經(jīng)典名著)
- OpenDaylight Cookbook
- Linux C/C++服務(wù)器開發(fā)實踐
- vSphere High Performance Cookbook
- 機(jī)械工程師Python編程:入門、實戰(zhàn)與進(jìn)階
- 精通Scrapy網(wǎng)絡(luò)爬蟲
- Python應(yīng)用輕松入門
- Python程序設(shè)計與算法基礎(chǔ)教程(第2版)(微課版)
- Visual Basic 6.0程序設(shè)計實驗教程
- 軟件測試綜合技術(shù)
- 創(chuàng)意UI Photoshop玩轉(zhuǎn)移動UI設(shè)計
- Modernizing Legacy Applications in PHP
- Xamarin Cross-Platform Development Cookbook
- Dart:Scalable Application Development
- Getting Started with Windows Server Security