Golang 初始化过程

488 阅读1分钟

启动 Go 程序的时候, 以下不同对象的初始化顺序是怎样的


  • import 依赖库
  • const 常量
  • var 变量
  • init() init 函数
  • main() 主函数

先说结论

  1. import

    依赖逐层遍历执行

    1.1. import 1.2. const 1.3. var 1.4. init()

  2. const

  3. var

  4. init()

  5. main()

19858408-179c1843bdcd424f.webp

代码验证

目录结构

image.png

// 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 

代码参考:golang init order demo

注意

由于 init 和 main 函数是顺序执行的, 所以如果有长期轮询的任务, 一定要异步执行, 否则会阻塞后续的逻辑执行