Golang1.21的 package 初始化顺序变更
目录
在 Go1.21之前,package 初始化并没有明确地规定,在1.21中明确了 package 初始化的顺序。
相关 issue:#
可能的影响#
如果某些项目如果依赖于包的初始化顺序,如上面 issue 中的例子,如果packagea的init()依赖了packageb中init()初始化的环境变量,那么 package 初始化顺序的变更可能会造成影响。
一个受影响的 issue 例子
包初始化顺序的算法#
- 对所有 import 的包进行排序,放在一个列表中
- 重复以下步骤,直到所有包都被初始化
- 找到第一个所有依赖的 import 包都已经被初始化的包
- 初始化该包,并从列表中移除
图示如下, 被初始化的包用绿色标记

其他参考#
Read other posts