Go中init的执行顺序 2022-08-19 17:28 这个没什么特别的,跟其他大多数语言一样,也和人们思维惯性理解的顺序相同。 结论: 被依赖的包 按物理顺序初始化他们的的全局变量 -> 按物流顺序执行他们的init() -> main的全局变量 -> main的init() -> main() 代码: main 依赖 pk1.package1.go, pk1.package.go 依赖 pk2的package2.go,pk2下还存在其他没有被直接依赖的文件package1.go和package3.go。 ![](https://minio.riun.xyz/riun1/2022-08-19_ls9QisVUbmhU88hIgo.jpg) trace.trace.go: ```go package trace import "fmt" func Trace(s string, i int) int { fmt.Println(s, ":", i) return i } ``` pk2.package1: ```go package pk2 import ( "TestGo/init/trace" "fmt" ) var Num2_1_1 = trace.Trace("init num2_1_1", 0) var Num2_1_2 = trace.Trace("init num2_1_2", 1) func init() { fmt.Println("init func in pk2_1") } ``` pk2.package2: ```go package pk2 import ( "TestGo/init/trace" "fmt" ) var Num2_2_1 = trace.Trace("init num2_2_1", 10) var Num2_2_2 = trace.Trace("init num2_2_2", 20) func init() { fmt.Println("init func in pk2_2") } ``` pk2.package3: ```go package pk2 import ( "TestGo/init/trace" "fmt" ) var Num2_3_1 = trace.Trace("init num2_3_1", 2) var Num2_3_2 = trace.Trace("init num2_3_2", 3) func init() { fmt.Println("init func in pk2_3") } ``` pk1.package1: ```go package pk1 import ( "TestGo/init/pk2" "TestGo/init/trace" "fmt" ) var Num1_1 = trace.Trace("init num1_1", pk2.Num2_2_1+20) var Num1_2 = trace.Trace("init num1_2", pk2.Num2_2_2+20) func init() { fmt.Println("init func in pk1") } ``` main.go: ```go package main import ( "TestGo/init/pk1" "TestGo/init/trace" "fmt" ) /* main 依赖 pk1.package1.go, pk1.package.go 依赖 pk2的package2.go init num2_1_1 : 0 init num2_1_2 : 1 init num2_2_1 : 10 init num2_2_2 : 20 init num2_3_1 : 2 init num2_3_2 : 3 init func in pk2_1 init func in pk2_2 init func in pk2_3 init num1_1 : 30 init num1_2 : 40 init func in pk1 init numM_1 : 50 init numM_2 : 60 init func up in main init func down in main main func 被依赖的包 按物理顺序初始化他们的的全局变量 -> 按物流顺序执行他们的init() -> main的全局变量 -> main的init() -> main() */ func init() { fmt.Println("init func up in main") } func init() { fmt.Println("init func down in main") } var numM_1 = trace.Trace("init numM_1", pk1.Num1_1+20) var numM_2 = trace.Trace("init numM_2", pk1.Num1_2+20) func main() { fmt.Println("main func") } ``` --END--
发表评论