go init函数_Go学习总结之程序初始化顺序

在一个Go程序中通常包含:包(package),常量(const),变量(var),init(),main()等元素,如果同时存在多个包,包之间存在依赖关系,那么各个元素的初始化顺序是如何呢?

初始化顺序

假设场景下pck1包含pkg2,pkg2包含pkg3,初始化顺序该是如何呢?

如果pkg1没有引入其他包的情况下,初始化顺序是package->const->var->init()->main();

如果包之间有相互依赖的话,那么依赖顺序是如下图所示:

b324252940496eb3928cce6491491000.png
  • 在main包中的go文件默认总是被执行
  • 同包下的不同go文件,按照文件名从小到大排序顺序执行;
  • 其他包只有被main包import才会执行,按照import的先后顺序执行;
  • 被递归import的包初始化顺序与import顺序相反,例如:导入顺序main->A->B->C,则初始化顺序为C->B->A->main
  • 一个包被其他多个包import,则只能初始化一次
  • main包总是最后一个被初始化,因为总是依赖别的包
  • 避免出现循环import

init与main函数

相同点

  1. 两个函数在定义时不能有任何的参数和返回值
  2. 该函数只能由 go 程序自动调用,不可以被引用

不同点

  1. init 可以应用于任意包中,且可以重复定义多个。
  2. main 函数只能用于 main 包中,且只能定义一个。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值