理解go中的init函数
2018-07-09 本文已影响174人
wenmingxing
本文主要介绍go中
init
函数的使用及意义。
I、init的几个特征
1、init
函数用于包的初始化,如初始化包中的变量,这个初始化在package xxx
的时候完成,也就是在main
之前完成;
2、每个包可以拥有多个init
函数, 每个包的源文件也可以拥有多个init
函数;
3、同一个包中多个init
函数的执行顺序是没有明确定义的,但是不同包的init
函数是根据包导入的依赖关系决定的。
4、init
函数不能被其他函数调用,其实在main
函数之前自动执行的。
II、例程
2.1 在main函数之前执行init
//test1
package main
import "fmt"
func main() {
fmt.Println("do in main")
}
func init() {
fmt.Println("do in init1")
}
func init() {
fmt.Println("do in init2")
}
运行结果:
这个例子的运行结果说明:init
函数在main
函数之前执行,每个源文件中可以包含多个init
函数。
2.2 init函数的执行顺序
现在我们init目录下的文件内容如下:
三个go程序代码分别如下所示:
// test.go
package main
import (
"fmt"
_ "./level1"
)
func main() {
fmt.Println("I am in main")
}
// level1.go
package level1
import (
"fmt"
_ "../level2"
)
func init() {
fmt.Println("I am in level1")
}
// level2.go
package level2
import "fmt"
func init() {
fmt.Println("I am in level2")
}
运行test.go
执行结果如下:
通过运行结果可以看出,go中不同包中init
函数的执行顺序是根据包的导入关系决定的。
并且这种关系为:
III、关于import _ " "
的说明
我们都知道,go对包导入非常严格,不允许导入不使用的包。但是有时候我们导入包只是为了做一些初始化的工作,这样就应该采用import _ " "
的形式,如第II节的例程中我们采用了import _ " "
的形式导入level1和level2包,这样就可以在只完成初始化,也不会报错。
【参考】
[1] 《The way to go》