多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
> `init函数`用于包的初始化,常用于初始化包中的变量;这个初始化在`package xxx`的时候完成,也就是在main执行前完成; ## 同一包多个init的执行顺序 > 多个init函数,谁放在前面谁先执行 ~~~ package main import "fmt" func main() { fmt.Println("do in main") } func init() { fmt.Println("do in init1") } func init() { fmt.Println("do in init2") } ~~~ > 运行结果 ~~~ do in init1 do in init2 do in main ~~~ ## 不同包的init的执行顺序 ### 例1 (依赖关系) > 导入含依赖关系的包,根据先进后出方式执行 **main.go** ~~~ package main import ( "fmt" _ "gintest/level1" ) func main() { fmt.Println("I am in main") } ~~~ **/level1/level1.go** ~~~ package level1 import ( "fmt" _ "gintest/level2" ) func init() { fmt.Println("I am in level1") } ~~~ **/level2/level2.go** ~~~ package level2 import "fmt" func init() { fmt.Println("I am in level2") } ~~~ > 运行结果 ~~~ I am in level2 I am in level1 I am in main ~~~ > 执行过程 ![](https://img.kancloud.cn/d6/cf/d6cfefac1a462103f5bacc8c35099cea_654x319.png) ### 例2 (非依赖关系) > 导入非依赖关系的包,先导入先执行 ~~~ // main.go package main import ( "fmt" _ "gintest/level1" _ "gintest/level2" ) func main() { fmt.Println("I am in main") } ~~~ > 执行结果 ~~~ I am in level1 I am in level2 I am in main ~~~