规则:
- package 只会被初始化一次
- 同一个 package,不同文件是按照文件名的顺序来初始化
- 不能循环 import , 例如:A import B ,然后又 B import A
- 任何 package , 都可以存在一个以上的 init() , 执行顺序由上而下
- main() 只能存在于 package main
- 属于 package main 的文件 , 都将会初始化
案例1
sandbox.go
package main
import "fmt"
var _ int64 = s()
func init() {
fmt.Println("init in sandbox.go")
}
func s() int64 {
fmt.Println("calling s() in sandbox.go")
return 1
}
func main() {
fmt.Println("main")
}
a.go
package main
import "fmt"
var _ int64 = a()
func init() {
fmt.Println("init in a.go")
}
func a() int64 {
fmt.Println("calling a() in a.go")
return 2
}
z.go
package main
import "fmt"
var _ int64 = z()
func init() {
fmt.Println("init in z.go")
}
func z() int64 {
fmt.Println("calling z() in z.go")
return 3
}
执行命令:
$ go run *.go
输出结果:
calling a() in a.go
calling s() in sandbox.go
calling z() in z.go
init in a.go
init in sandbox.go
init in z.go
main
案例2
sandbox.go
package main
import "fmt"
func init() {
fmt.Println("init 1")
}
func init() {
fmt.Println("init 2")
}
func main() {
fmt.Println("main")
}
utils.go
package main
import "fmt"
func init() {
fmt.Println("init 3")
}
执行命令:
$ go run *.go
输出结果:
init 1
init 2
init 3
main
有疑问加站长微信联系(非本文作者)