本文主要介紹go中
init
函數(shù)的使用及意義宛琅。
I刻蟹、init的幾個(gè)特征
1、init
函數(shù)用于包的初始化嘿辟,如初始化包中的變量舆瘪,這個(gè)初始化在package xxx
的時(shí)候完成,也就是在main
之前完成红伦;
2英古、每個(gè)包可以擁有多個(gè)init
函數(shù), 每個(gè)包的源文件也可以擁有多個(gè)init
函數(shù)色建;
3哺呜、同一個(gè)包中多個(gè)init
函數(shù)的執(zhí)行順序是沒有明確定義的舌缤,但是不同包的init
函數(shù)是根據(jù)包導(dǎo)入的依賴關(guān)系決定的箕戳。
4、init
函數(shù)不能被其他函數(shù)調(diào)用国撵,其實(shí)在main
函數(shù)之前自動(dòng)執(zhí)行的陵吸。
II、例程
2.1 在main函數(shù)之前執(zhí)行init
//test1
package main
import "fmt"
func main() {
fmt.Println("do in main")
}
func init() {
fmt.Println("do in init1")
}
func init() {
fmt.Println("do in init2")
}
運(yùn)行結(jié)果:
這個(gè)例子的運(yùn)行結(jié)果說明:init
函數(shù)在main
函數(shù)之前執(zhí)行介牙,每個(gè)源文件中可以包含多個(gè)init
函數(shù)壮虫。
2.2 init函數(shù)的執(zhí)行順序
現(xiàn)在我們init目錄下的文件內(nèi)容如下:
三個(gè)go程序代碼分別如下所示:
// test.go
package main
import (
"fmt"
_ "./level1"
)
func main() {
fmt.Println("I am in main")
}
// level1.go
package level1
import (
"fmt"
_ "../level2"
)
func init() {
fmt.Println("I am in level1")
}
// level2.go
package level2
import "fmt"
func init() {
fmt.Println("I am in level2")
}
運(yùn)行test.go
執(zhí)行結(jié)果如下:
通過運(yùn)行結(jié)果可以看出,go中不同包中init
函數(shù)的執(zhí)行順序是根據(jù)包的導(dǎo)入關(guān)系決定的环础。
并且這種關(guān)系為:
III囚似、關(guān)于import _ " "
的說明
我們都知道,go對包導(dǎo)入非常嚴(yán)格线得,不允許導(dǎo)入不使用的包饶唤。但是有時(shí)候我們導(dǎo)入包只是為了做一些初始化的工作,這樣就應(yīng)該采用import _ " "
的形式贯钩,如第II節(jié)的例程中我們采用了import _ " "
的形式導(dǎo)入level1和level2包募狂,這樣就可以在只完成初始化,也不會(huì)報(bào)錯(cuò)角雷。
【參考】
[1] 《The way to go》