先放结论:
1. 先初始化被依赖的包,并且每个包仅会之初始化一次。
2. 包内:按照 常量 -> 变量 -> init() 函数。这里的变量说的是全局变量
3. 包内的多个 init() 函数按出现次序进行自动调用
注意:如果 Go 的版本为 1.22 的话,那么写代码测试的时候,结果可能会是 变量 -> 常量。具体原因可以看:
https://github.com/golang/go/issues/66575
init() 函数
作用:进行包的初始化
特性:
1. 优先于 main 函数执行
2. 不能显示调用,通过导包的方式”import _ modulepath/目录” 的方式隐式调用
3. 同一个包内,甚至同一个文件内可以有多个 init() 函数而不会报错
4. 多个 init() 函数顺序执行,只有当一个 init() 函数执行完毕后,才会进行下一个 init 函数。
在项目中如非必要,禁止隐式的 init 初始化,协作人员多了,各种千奇百怪的问题都可能导致程序执行失败。转而使用显式的初始化,直接在 main 函数中调用对应的初始化方法。
main() 函数
main 包中的 main 函数,也就是 main.main,它是所有 Go 可执行程序的用户层执行逻辑的入口函数。Go 程序在用户层面的执行逻辑,会在这个函数内按照它的调用顺序展开。
在 多 goroutine 的情况下,main 函数在 main goroutine 中执行
main 函数返回,就意味着整个程序的终结,其他子 goroutine 全部停止执行