golang 包 变量 初始化顺序

2 阅读1分钟

在 Go 语言 中,包、变量和 init() 的初始化顺序是有严格规则的,理解它有助于避免运行时的意外行为。

Go 初始化顺序规则

  1. 包的导入顺序 当一个 Go 程序运行时,首先会根据 依赖关系 初始化包。 如果包 A 依赖包 B,那么 先初始化 B,再初始化 A。 同一层级的包,按 import 语句的顺序初始化。
  2. 包内初始化顺序 在一个包内,初始化顺序如下:

常量初始化

按照声明顺序初始化。 常量必须在编译期可确定值。 包级变量初始化

按声明顺序执行。 如果变量初始化依赖其他包的变量,会先初始化依赖包。 init() 函数执行

一个包可以有多个 init(),可能分布在不同文件中。 执行顺序: 按文件名的字典序排序文件。 同一文件内,按代码出现顺序执行多个 init()。 3. 主程序执行顺序 初始化所有依赖包(递归执行上面的规则)。 初始化 main 包的常量、变量。 执行 main 包的所有 init()。 执行 main.main() 函数。