官术网_书友最值得收藏!

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ù)都是在主線程完成,它們也滿足順序一致性模?型。

主站蜘蛛池模板: 修水县| 太谷县| 宜宾市| 恩平市| 青海省| 博乐市| 礼泉县| 镇康县| 汝南县| 含山县| 巴青县| 阳江市| 宣恩县| 阳信县| 乌兰浩特市| 凤城市| 朝阳区| 慈利县| 金华市| 大兴区| 洛宁县| 龙口市| 萨嘎县| 文登市| 水城县| 宜宾县| 博客| 扶沟县| 红原县| 高尔夫| 青阳县| 巩义市| 高陵县| 邮箱| 微山县| 井研县| 横山县| 元朗区| 普陀区| 大洼县| 武山县|