Golang中不同Init函数的优先级问题
Golang中不同Init函数的优先级问题 大家好
我正在做一个基础项目。
在我的项目中,包内还有两个子包。
每个子包都有其自己的 init() 函数。
这是我的文件夹结构:

第二个文件是主包。
以下是两个文件的完整详情:

我搜索过,但没有找到合适的答案来解释哪个 INIT() 函数会先运行以及原因? 提前感谢。
更多关于Golang中不同Init函数的优先级问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html
3 回复
init函数的编写方式应确保其执行顺序无关紧要。- 官方编译器的一个已知实现细节是:导入的包将按词法顺序加载。在每个包内部,文件同样按词法顺序加载。因此,你可以通过手动解析这些导入步骤来推断
init函数的执行顺序。 - 编译器的其他实现可能与我第2点所述的行为不同,因此最好遵守第1点。
不过,你可以依赖的是:在你进入当前文件的 init 函数之前,你所 import 的包中潜在的 init 函数已经运行完毕。因此,这在一定程度上保证了 main 包的 init 函数总是最后一个运行的 init 函数。
在Go语言中,init()函数的执行顺序由导入依赖关系决定,遵循以下规则:
-
包级别初始化顺序:
- 首先初始化导入的包(递归执行)
- 然后初始化当前包的常量和变量
- 最后执行当前包的
init()函数
-
同一包内多个init()的执行顺序:
- 按照文件名的字典序执行
- 同一文件内的多个
init()按声明顺序执行
-
主包初始化:
- 所有导入的包初始化完成后,才执行
main()函数
- 所有导入的包初始化完成后,才执行
根据你的项目结构,假设有以下导入关系:
// main.go
package main
import (
"project/subpackage1"
"project/subpackage2"
)
执行顺序将是:
subpackage1的init()(如果它依赖其他包,会先初始化依赖)subpackage2的init()main包的init()(如果有)main()函数
示例代码说明:
// subpackage1/pkg1.go
package subpackage1
import "fmt"
func init() {
fmt.Println("subpackage1 init")
}
// subpackage2/pkg2.go
package subpackage2
import "fmt"
func init() {
fmt.Println("subpackage2 init")
}
// main.go
package main
import (
"fmt"
"project/subpackage1"
"project/subpackage2"
)
func init() {
fmt.Println("main package init")
}
func main() {
fmt.Println("main function")
}
输出结果:
subpackage1 init
subpackage2 init
main package init
main function
如果同一包内有多个文件都有init()函数,比如:
subpackage1/a.go和subpackage1/b.go- 且
a.go在字典序上小于b.go
那么执行顺序是:
a.go的init()b.go的init()
这种设计确保了依赖包先于使用它们的包初始化,避免了循环依赖问题。

