go語言中init函式用於包(package)的初始化,該函式是go語言的一個重要特性,有下面的特徵:
1 init函式是用於程式執行前做包的初始化的函式,比如初始化包裡的變數等
2 每個包可以擁有多個init函式
3 包的每個原始檔也可以擁有多個init函式
4 同一個包中多個init函式的執行順序go語言沒有明確的定義
5 不同包的init函式按照包匯入的依賴關係決定該初始化函式的執行順序
6 init函式不能被其他函式呼叫,而是在main函式執行之前,自動被呼叫
包的初始化
為了使用匯入的包,首先必須將其初始化。初始化總是以單執行緒執行,並且按照包的依賴關係順序執行。這通過Golang的執行時系統控制,如下圖所示:
- 初始化匯入的包(遞迴匯入)
- 對包塊中宣告的變數進行計算和分配初始值
- 執行包中的init函式
下面二個檔案進行演示:main.go
package main
import (
"fmt"
)
var _ int64 = cc()
func init() {
fmt.Println("main.init1")
}
func init() {
fmt.Println("main. init2")
}
func cc() int64 {
fmt.Println("calling cc() in main.go")
return 1
}
func main() {
fmt.Println("main.ing")
}
ap.go
package main
import "fmt"
func init() {
fmt.Println("ap.init1")
}
func init() {
fmt.Println("ap.init2")
}
執行 go build ap.go main.go,編譯之後執行./main:
calling cc() in main.go
main.init1
main. init2
ap.init1
ap.init2
main.ing
可以得出的是:
1 一個package或者是go檔案可以包含多個init函式,
2 init函式是在main函式之前執行的,
3 init函式被自動呼叫,不能在其他函式中呼叫,顯式呼叫會報該函式未定義
執行順序:解析變數 > init 函式 > main 函式
本作品採用《CC 協議》,轉載必須註明作者和本文連結