Golang中不同Init函数的优先级问题

Golang中不同Init函数的优先级问题 大家好

我正在做一个基础项目。 在我的项目中,包内还有两个子包。 每个子包都有其自己的 init() 函数。 这是我的文件夹结构: Screenshot from 2020-07-05 13-20-59

第二个文件是主包。 以下是两个文件的完整详情: Screenshot from 2020-07-05 13-23-43

我搜索过,但没有找到合适的答案来解释哪个 INIT() 函数会先运行以及原因? 提前感谢。


更多关于Golang中不同Init函数的优先级问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

谢谢!!

更多关于Golang中不同Init函数的优先级问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


  1. init 函数的编写方式应确保其执行顺序无关紧要。
  2. 官方编译器的一个已知实现细节是:导入的包将按词法顺序加载。在每个包内部,文件同样按词法顺序加载。因此,你可以通过手动解析这些导入步骤来推断 init 函数的执行顺序。
  3. 编译器的其他实现可能与我第2点所述的行为不同,因此最好遵守第1点。

不过,你可以依赖的是:在你进入当前文件的 init 函数之前,你所 import 的包中潜在的 init 函数已经运行完毕。因此,这在一定程度上保证了 main 包的 init 函数总是最后一个运行的 init 函数。

在Go语言中,init()函数的执行顺序由导入依赖关系决定,遵循以下规则:

  1. 包级别初始化顺序

    • 首先初始化导入的包(递归执行)
    • 然后初始化当前包的常量和变量
    • 最后执行当前包的init()函数
  2. 同一包内多个init()的执行顺序

    • 按照文件名的字典序执行
    • 同一文件内的多个init()按声明顺序执行
  3. 主包初始化

    • 所有导入的包初始化完成后,才执行main()函数

根据你的项目结构,假设有以下导入关系:

// main.go
package main

import (
    "project/subpackage1"
    "project/subpackage2"
)

执行顺序将是:

  1. subpackage1init()(如果它依赖其他包,会先初始化依赖)
  2. subpackage2init()
  3. main包的init()(如果有)
  4. 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.gosubpackage1/b.go
  • a.go在字典序上小于b.go

那么执行顺序是:

  1. a.goinit()
  2. b.goinit()

这种设计确保了依赖包先于使用它们的包初始化,避免了循环依赖问题。

回到顶部