首发于:https://studygolang.com/articles/13158
让我们直接从两个 语言小程序开始:
程序1
程序2
如果这两段代码会输出相同的结果,那么它们就不是好的素材,很幸运的是,它们的结果是不同的:
程序1
程序2
这个程序无法编译通过,甚至会在第 7 行报一个编译时错误 。
究竟是什么带来了这种差异?变量声明中 "正常" 的初始化表达式,按照你所期望的从左到右和从上到下进行初始化:
输出:
前面提到的 "正常" 意味着它在自己的函数中完成初始化。当这些初始化代码像程序1中那样被放到包的顶层声明中时,会变得越来越有趣:
这些变量声明的顺序如下:
b 是第一个,因为它不依赖其他未初始化的变量
c 是第二个,在 函数需要的变量 被初始化之后,紧接着被初始化
a 是在 被初始化之后的第三轮初始化循环中被处理
程序的输出为:
按照声明的顺序,每一轮初始化流程都选取第一个可以被初始化的变量。整个过程持续到所有变量都被完成初始化或者编译器找到一个类似于如下的循环:
上面的代码会导致编译时错误 。
初始化依赖机制是基于包级别工作的:
sandbox.go
utils.go
编译及输出:
via: https://medium.com/golangspec/initialization-dependencies-in-go-51ae7b53f24c
作者:Michał Łowicki
译者:rxcai
校对:polaris1119
本文由 GCTT 原创编译,Go语言中文网 荣誉推出
领取专属 10元无门槛券
私享最新 技术干货