在之前的例子中提到过初始化的顺序问题和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文件的顺序,那么打印的顺序也就会发生相应的变化了。
网友评论