简介
init()函数会在每个包完成初始化后自动执行,并且执行优先级比main函数高。init 函数通常被用来:
- 对变量进行初始化
- 加载项目中的配置变量
- 检查/修复程序的状态
- 注册
- 运行一次计算
例子
func init() {
fmt.Println("do init")
}
func main(){
fmt.Println("main --->")
}
包的初始化
为了使用导入的包,首先必须将其初始化。初始化总是以单线程执行,并且按照包的依赖关系顺序执行。这通过Golang的运行时系统控制
- 初始化导入的包,按照依赖顺序依次导入,并且做下面操作
- 对包块中声明的变量进行计算和分配初始值
- 执行包中的init函数
- 对包块中声明的变量进行计算和分配初始值
- 执行包中的init函数
demo
var _ int64=getInt64()
func init(){
fmt.Println("do init 1 ")
}
func init(){
fmt.Println("do init 2")
}
func getInt64() int64{
fmt.Println("do getInt64 ")
return 1
}
func main(){
fmt.Println("do main")
}
输出:
do getInt64
do init 1
do init 2
do main
特点
- 每个包可以拥有多个init函数,每个源文件中可以包含多个init函数
- init函数不需要传入参数,也不会返回任何值。
- 同一个包中多个init函数的执行顺序go语言没有明确的定义 (很多博客上都说没有明确定义,但是经过个人多次测试感觉应该是顺序执行)
Demo
init.go
package main
import "fmt"
func init(){
fmt.Println("do init 1 ")
}
func init(){
fmt.Println("do init 2")
}
func getInt64() int64{
fmt.Println("do getInt64 ")
return 1
}
main.go
package main
import "fmt"
func init() {
fmt.Println("do init")
}
func main(){
fmt.Println("main --->")
}
输出
do init 1
do init 2
do init
main
- 不同包的init函数按照包导入的依赖关系决定该初始化函数的执行顺序
- init函数不能被其他函数调用,而是在main函数执行之前,自动被调用
补充知识
Go要求非常严格,不允许引用不使用的包,不过我们可以采用下面的格式(import _ pkg)来引用,只是用它来执行对应包的init函数。
import _ "image/png"
参考资料