golang 多個(gè) init 方法的執(zhí)行順序
在 golang 里的 main 函數(shù)是程序的入口函數(shù),main 函數(shù)返回后,程序也就結(jié)束了。golang 還有另外一個(gè)特殊的函數(shù) init 函數(shù),先于 main 函數(shù)執(zhí)行,實(shí)現(xiàn)包級(jí)別的一些初始化操作,那么多個(gè) init 函數(shù)的執(zhí)行順序是怎么樣的呢?讓我們實(shí)踐一下看下結(jié)果吧。
目錄結(jié)構(gòu):
├──?a
│???└──?a.go
├──?b
│???└──?b.go
└──?main.go
main.go 文件代碼:
package?main
import?(
????????"fmt"
????????"./b"
????????"./a"
)
func?init()?{
????fmt.Println("main?init?1")
}
func?init()?{
????fmt.Println("main?init?2")
}
func?main()?{
????fmt.Println("main")
????a.Add()
????b.Add()
}
a.go 文件代碼:
package?a
import?"fmt"
func?init()?{
????fmt.Println("a?init")
}
func?Add()?{
????fmt.Println("a?Add")
}
b.go 文件代碼:
package?b
import?"fmt"
func?init(){
????fmt.Println("b?init")
}
func?Add(){
????fmt.Println("b?Add")
}
輸出結(jié)果:
????[gotest]??go?run?main.go
b?init
a?init
main?init?1
main?init?2
main
a?Add
b?Add
結(jié)論:
可以看出執(zhí)行順序是按照導(dǎo)入包的順序執(zhí)行,而不是按照調(diào)用先后順序執(zhí)行。
init 函數(shù)的主要作用:初始化。
init 函數(shù)的主要特點(diǎn):
init函數(shù)先于main函數(shù)自動(dòng)執(zhí)行,不能被其他函數(shù)調(diào)用;init函數(shù)沒有輸入?yún)?shù)、返回值;- 每個(gè)包可以有多個(gè)
init函數(shù); - 包的每個(gè)源文件也可以有多個(gè)
init函數(shù),這點(diǎn)比較特殊; - 同一個(gè)包的
init執(zhí)行順序,golang沒有明確定義,編程時(shí)要注意程序不要依賴這個(gè)執(zhí)行順序。 - 不同包的
init函數(shù)按照包導(dǎo)入的依賴關(guān)系決定執(zhí)行順序。
評(píng)論
圖片
表情
