前言
go
的 init
函数给人的感觉怪怪的,我想不明白聪明的 google
团队为何要设计出这么一个“鸡肋“的机制。实际编码中,我主张尽量不要使用init
函数。
首先来看看 init
函数的作用吧。
init()
介绍
init()
与包的初始化顺序息息相关,所以先介绍一个go
中包的初始化顺序吧。(下面的内容部分摘自《The go programinng language》)
大体而言,顺序如下:
- 首先初始化包内声明的变量
- 之后调用
init
函数 - 最后调用
main
函数
变量的初始化顺序
变量的初始化顺序由他们的依赖关系决定
应该任何强类型语言都是这样子吧。
例如:
var a = b + c;
var b = f(); // 需要调用 f() 函数
var c = 1
func f() int{
return c + 1;}
a
依赖 b
和 c
;b
依赖 f()
,f()
依赖 c
。因此,他们的初始化顺序理所当然是 c -> b -> a
。