启动 Go 程序的时候, 以下不同对象的初始化顺序是怎样的
import依赖库const常量var变量init()init 函数main()主函数
先说结论
-
import依赖逐层遍历执行
1.1.
import1.2.const1.3.var1.4.init() -
const -
var -
init() -
main()
代码验证
目录结构
// main.go
package main
import (
"fmt"
"github.com/wooonderful/demoprojects/init_order/pkg/pkg1"
)
const (
constA = 1
)
var (
varB = 2
)
func init() {
fmt.Println("main.go's init function")
}
func main() {
fmt.Println("it's main function")
pkg1.Add()
}
// lib.go
package pkg1
import "fmt"
const (
constC = 3
)
var (
varD = 4
)
func init() {
fmt.Println("pkg1's init function")
}
func Add() {
fmt.Printf("it's pkg1 add function, result = %d \n", constC+varD)
}
执行结果如下
s@m init_order % go run main.go
pkg1's init function
main.go's init function
it's main function
it's pkg1 add function, result = 7
注意
由于 init 和 main 函数是顺序执行的, 所以如果有长期轮询的任务, 一定要异步执行, 否则会阻塞后续的逻辑执行