init 函数是个无参数,无返回值的函数,其主要作用是做一些包级数据的初始化与初始状态的检查工作。

func init() {
  ...
}

Golang 运行时会在包初始化时调用包中定义的 init 函数,而用户的代码是不能调用 init 函数的,编译时会报错。

一个包内可以包含多个 init 函数,在初始化时,运行时会按照一定顺序执行所有 init 函数,并且不会并发调用,每个 init 函数都只会被执行一次。

在一个包中 init 的执行顺序是在其他包级变量之后。

虽然运行时会按固定的顺序执行 init 函数,但是 Golang 的习惯是不依赖 init 函数的执行次序。

init 函数执行顺序