在一个Go程序中通常包含:包(package),常量(const),变量(var),init(),main()等元素,如果同时存在多个包,包之间存在依赖关系,那么各个元素的初始化顺序是如何呢?
初始化顺序
假设场景下pck1包含pkg2,pkg2包含pkg3,初始化顺序该是如何呢?
如果pkg1没有引入其他包的情况下,初始化顺序是package->const->var->init()->main();
如果包之间有相互依赖的话,那么依赖顺序是如下图所示:
- 在main包中的go文件默认总是被执行
- 同包下的不同go文件,按照文件名从小到大排序顺序执行;
- 其他包只有被main包import才会执行,按照import的先后顺序执行;
- 被递归import的包初始化顺序与import顺序相反,例如:导入顺序main->A->B->C,则初始化顺序为C->B->A->main
- 一个包被其他多个包import,则只能初始化一次
- main包总是最后一个被初始化,因为总是依赖别的包
- 避免出现循环import
init与main函数
相同点:
- 两个函数在定义时不能有任何的参数和返回值
- 该函数只能由 go 程序自动调用,不可以被引用
不同点:
- init 可以应用于任意包中,且可以重复定义多个。
- main 函数只能用于 main 包中,且只能定义一个。