init函数

使用一个导入的包,首先要对这个包进行初始化,这一步在main.main函数执行之前,由runtime来完成,分以下步骤:

  1. 初始化导入的包;
  2. 初始化包作用域中的变量;
  3. 执行包中的init函数。包被导入了多次,也只会执行一次包的初始化。

init 函数特点

  • init函数不需要传入参数也没有返回值,而且init函数是不能被其他函数调用的。

  • 每个包及文件可以拥有多个init函数

  • 同一个包中多个init函数的执行顺序go语言没有明确的定义
  • 不同包的init函数按照包导入的依赖关系决定该初始化函数的执行顺序

init函数要是适当使用,尤其是有依赖顺序的需要小心,因为对于复杂点的项目来说,init函数的执行顺序难以捉摸。

Go一个包中可以包含很多文件,那么变量的初始化顺序与各个包的init函数执行顺序又是怎样的呢?

首先,runtime的初始化依赖机制会启动,当初始化依赖机制计算完成后,就需要决定a.go和z.go中的变量谁先初始化,这取决于呈现给编译器的文件顺序,一般来说是按文件名的字典序,但是变量间或各个包间有依赖需要另外讨论。如果z.go先被传到build系统,那么z.go的变量初始化就比a.go先一步完成。

同一个包中,变量的初始化顺序是按文件名的字典序,但同时runtime也会解析变量间依赖关系,没有依赖的变量最先初始化,init函数的执行顺序也同理。

init()

有些导入的包中前面加了个下划线”_“,这表示只是想执行包中的init函数。如:

import(
  _ "net/http/pprof"
	_ "github.com/mkevac/debugcharts"
)

更新时间: