Golang Init函数执行顺序

在Golang中,当多个包相互依赖时,它们的init函数执行顺序是怎样的?如果同一个包里有多个init函数,它们的执行顺序又是如何确定的?有没有可能通过某种方式控制init函数的执行顺序?

2 回复

Golang中init函数执行顺序:

  1. 按导入顺序执行依赖包的init
  2. 同一包内按文件名字典序执行init
  3. 同一文件中按声明顺序执行init
  4. 最后执行main包的init

注意:init函数自动执行,无需调用。

更多关于Golang Init函数执行顺序的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go语言中,init函数的执行顺序遵循以下规则:

  1. 包内init函数顺序:同一个包中,init函数按照在代码中出现的顺序执行(从上到下)。
  2. 包间依赖顺序:不同包之间,init函数按照导入依赖关系执行。被导入的包的init函数先执行,导入者的init函数后执行。
  3. 全局变量初始化优先:包级别变量的初始化在init函数之前完成。

示例代码

// 包a
package a
import "fmt"
var A = func() int {
    fmt.Println("a: 全局变量初始化")
    return 1
}()
func init() { fmt.Println("a: init函数") }

// 包b
package b
import "fmt"
var B = func() int {
    fmt.Println("b: 全局变量初始化")
    return 2
}()
func init() { fmt.Println("b: init函数") }

// 主包
package main
import (
    "a"
    "b"
    "fmt"
)
func init() { fmt.Println("main: init函数") }
func main() { fmt.Println("main: 主函数执行") }

输出顺序

a: 全局变量初始化
a: init函数
b: 全局变量初始化
b: init函数
main: init函数
main: 主函数执行

注意事项

  • 避免在init中进行复杂逻辑或阻塞操作。
  • 多个包导入时,依赖关系形成有向无环图(DAG),init按依赖拓扑顺序执行。
  • 同一个包内不要依赖init的执行顺序编写逻辑(除非明确顺序)。
回到顶部