函数特性
init函数作为Go的两个保留函数之一(另一个是main函数)有很多特殊性:
- init函数没有入参和返回值
- init函数不能被显式调用
- 一个package中可以包含多个init函数
- 一个go文件中可以包含多个init函数
何时调用
程序的初始化都从pkg main开始,如果main引入了其他package,在编译的时候就会将他们依次导入。初始化是在一个goroutine中进行的,init函数可以引入新的goroutine,但只有在当前init函数返回后才会执行下一个init,同一个package中多个init遵循文件名排序,不同package的init遵循引入顺序。具体参考下图:
示例
下面是stackoverflow的一个例子链接
package main
import "fmt"
var WhatIsThe = AnswerToLife()
func AnswerToLife() int {
return 43
}
func init() {
WhatIsThe = 0
}
func main() {
if WhatIsThe == 0 {
fmt.Println("It's all a lie.")
}
}
执行结果是:It’s all a lie.
从初始化顺序图可知:先初始化全局变量WhatIsThe=43,然后执行init,将WhatIsThe置为0,最后执行main函数,得到结果:It’s all a lie.