在Go语言中,init函数的执行顺序遵循以下规则:
- 包内
init函数顺序:同一个包中,init函数按照在代码中出现的顺序执行(从上到下)。
- 包间依赖顺序:不同包之间,
init函数按照导入依赖关系执行。被导入的包的init函数先执行,导入者的init函数后执行。
- 全局变量初始化优先:包级别变量的初始化在
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的执行顺序编写逻辑(除非明确顺序)。