首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Go 语言中的初始化依赖项

首发于: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语言中文网 荣誉推出

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181231B0B6PV00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券