在 Go1.21之前,package 初始化并没有明确地规定,在1.21中明确了 package 初始化的顺序。

相关 issue:#

可能的影响#

如果某些项目如果依赖于包的初始化顺序,如上面 issue 中的例子,如果packageainit()依赖了packagebinit()初始化的环境变量,那么 package 初始化顺序的变更可能会造成影响。

一个受影响的 issue 例子

包初始化顺序的算法#

  • 对所有 import 的包进行排序,放在一个列表中
  • 重复以下步骤,直到所有包都被初始化
    • 找到第一个所有依赖的 import 包都已经被初始化的包
    • 初始化该包,并从列表中移除

图示如下, 被初始化的包用绿色标记 package init

demo code

其他参考#