一、init函数介绍
- 一个.go文件中可以定义一个init()函数,它用来做一些初始化操作,另外,该函数在包导入中也起到重要的作用
- init函数有哪些特点:
- init函数不能被主动调用,也不能在包外通过包名调用
- init函数没有参数也没有返回值
- 另外,init函数在导入包的时候会自动执行。例如B包的b.go中有一个init函数,A包中的a.go在导入B包的时候,B包中的init函数会自动执行
- init函数一般用来:
- 对变量进行初始化
- 检查/修复程序的状态
- 注册
- 运行一次计算
二、在本地包执行
init函数执行时机
- 一个包如果拥有init函数,那么在运行main()函数之前,全局声明之后会自动执行init()函数
演示案例
package main import ( "fmt" ) var golbalValue int64 func init() { golbalValue = 100 f() } func f() { fmt.Println("init...") } func main() { fmt.Println("golbalValue: ", golbalValue) }
三、在导入包中执行
导入包的顺序
- Go语言导入包的规则:会先从main包开始检查其导入的所有包,每个包中又可能导入了其他的包。Go编译器由此构建出一个树状的包引用关系,再根据引用顺序决定编译顺序,依次编译这些包的代码
- init()在包导入中的执行时机是什么呢?
- 一个包在导入另一个包时,会自动执行另一个包中的init()函数
- 例如B包定义了一个init()函数,A包在调用B包时,B包中的init()函数会自动执行
- 在运行时,被最后导入的包会最先初始化并调用其init()函数, 如下图示:
- 一个应用场景:例如我们的程序导入了另一个包,但是不会使用到里面的任何变量和函数,我们仅仅是想执行另外一个包中的init()函数(例如,该init()函数会执行一个数据库的初始化等等),这个时候我们就可以"空导入"这个包,然后不使用其中的内容,但执行其包中的init()函数
演示案例
- 第一步:假设现在我们在GOPATH/src/code.dobgshao.com/studgo/testpack/目录下有一个main.go文件,其内部定义了一个Init()函数
- 第二步:现在我们在另一个包中导入上面的那个包,并且它也有自己的init()函数
- 第三步:现在我们执行上面的main.go,可以看到其执行了另一个包中的init()函数,然后再执行自己的init()函数
来源:oschina
链接:https://my.oschina.net/u/4316695/blog/4771868