1. init()函數
init()函數會在包被初始化後自動執行,並且在main()函數之前執行,但是需要注意的是init()以及main()函數都是無法被顯式調用的,如下圖:
運行報錯如下:
2. 執行順序
那麼init()是不是最先執行的呢? 答案是否定的,首先,在他之前會進行全局變量的初始化;如下代碼:
main.go:
package main
import (
"fmt"
"chapter02/utils"
)
var variate int = 3
func init(){
fmt.Println("main init3....")
}
func init(){
fmt.Printf("main全局變量初始化:%d\n",variate)
fmt.Println("main init.....")
}
func init(){
fmt.Println("main init2....")
}
func main(){
fmt.Println("main main.....")
utils.Print()
}
utils.go
package utils
import "fmt"
var A int = 3
func init(){
fmt.Println("utils A: ",A)
fmt.Println("utils init....")
}
func init(){
fmt.Println("utils init2....")
}
func Print(){
fmt.Println("utils print....")
}
輸出如下:
utils A: 3
utils init....
utils init2....
main init3....
main全局變量初始化:3
main init.....
main init2....
main main.....
utils print....
分析
根據上述代碼以及輸出來看,我們不難看出,當我們導入其他包時,會先初始化導入的包,而初始化包時,會先加載全局變量,而後從上到下加載init()函數,當被導入的包的init()函數執行完畢後,執行調用方的全局變量加載,init()函數的順序加載,之後執行main()函數。