Golang init函数

函数特性

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.


版权声明:本文为daiominribao原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。