在之前的例子中提到過初始化的順序問題和init函數:
觀察一下下面的兩段代碼:
a.go:
package main
import "fmt"
var _ = a()
func a() int {
fmt.Println("this is a file!")
return 1
}
func init() {
fmt.Println("init a file!")
}
runner.go:
package main
import "fmt"
var _ = r()
func r() int {
fmt.Println("this is main!")
return 1
}
func init() {
fmt.Println("init main file")
}
func main() {
fmt.Println("this is main function!")
}
這兩個文件在同一個包下面,根據之前說的原則,首先應該初始化的是包級別的變量,也就是說,執行後會首先打印:
//這裏順序是以我的輸入順序爲準的
this is a file!
this is main!
然後就會進入init函數,因此之後的打印應該是:
//打印順序同上
init a file!
init main file
最後纔會進入main函數,打印this is main function!
我的命令一定是這樣的
go run a.go runner.go
如果我調換兩個go文件的順序,那麼打印的順序也就會發生相應的變化了。