go語言中init函數用於包(package)的初始化,該函數是go語言的一個重要特性,
有下面的特征:
- 1 init函數是用於程序執行前做包的初始化的函數,比如初始化包里的變量等
- 2 每個包可以擁有多個init函數
- 3 包的每個源文件也可以擁有多個init函數
- 4 同一個包中多個init函數的執行順序go語言沒有明確的定義 (應該是順序執行)
- 5 不同包的init函數按照包導入的依賴關系決定該初始化函數的執行順序
- 6 init函數不能被其他函數調用,而是在main函數執行之前,自動被調用
下面演示一個文件中可以有多個init函數,執行順序是從上往下執行。
aaa.go
package core
import "fmt"
func init() {
fmt.Println("core aaa init")
}
func init() {
fmt.Println("core aaa init2")
}
func Show() {
fmt.Println("core show")
}
下面是core包中的另一個文件也是有init函數。
bbb.go
package core
import "fmt"
func init() {
fmt.Println("core bbb init")
}
執行main方法的時候會輸出三行:
core aaa init core aaa init2 core bbb init
一般來說,如果只需要一個包的 init函數,不需要這個包另外的方法,可以這么寫,這樣就表示只執行這個包的 init函數。
_ "github.com/goinaction/code/chapter3/dbdriver/postgres"
