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

相关issue:

可能的影响

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

一个受影响的issue例子

包初始化顺序的算法

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

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

demo code

其他参考