首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go包初始化

Go包初始化
EN

Stack Overflow用户
提问于 2013-07-18 20:25:28
回答 1查看 13.8K关注 0票数 21

形势:

Go包A由3个.go文件组成,我在每个文件中使用来自另一个包B的函数。我必须在每个文件的开头导入B包。

问题:

B包是实际初始化3次还是仅初始化1次?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-18 20:36:15

简单回答:初始化只执行一次。

较长的答案:引用相关规范部分- 程序执行

不导入的包通过将初始值赋值给所有包级变量,然后调用任何具有名称和签名的包级函数来初始化。 func init() 在其来源中定义。具有名称init的包范围或文件范围标识符只能声明为具有此签名的函数。可以定义多个这样的函数,甚至在一个源文件中;它们以未指定的顺序执行。 在包中,包级变量被初始化,并根据引用的顺序确定常量值:如果A的初始化器依赖于B,则A将在B之后设置。依赖性分析不依赖于正在初始化的项的实际值,只取决于它们在源中的外观。A依赖于B,如果A的值包含对B的提及,包含一个初始化器提到B的值,或者递归地提到一个提到B的函数。如果这种依赖关系形成一个循环,则这是一个错误。如果两个项不相互依赖,它们将按照它们在源文件中的出现顺序进行初始化,可能在多个文件中进行初始化,就像提交给编译器的那样。由于依赖关系分析是在每个包中进行的,所以如果A的初始化程序调用引用B的另一个包中定义的函数,则可以产生未指定的结果。 init函数不能从程序中的任何地方引用。特别是,不能显式调用init,也不能将指向init的指针分配给函数变量。 如果包有导入,则在初始化包本身之前初始化导入的包。如果多个包导入包P,则P将只初始化一次。 通过构造导入包,可以保证初始化过程中不存在循环依赖关系。 一个完整的程序是通过将一个名为主包的未导入的包与它导入的所有包(过渡)链接起来创建的。主包必须具有包名main,并声明一个不带参数且不返回值的函数main。 (){…} 程序执行首先初始化主包,然后调用函数main。当函数main返回时,程序将退出。它不会等待其他的(非主要的)峡谷完成。 包初始化--变量初始化和init函数的调用--按顺序在一个周期内进行,每次一个包。init函数可能启动其他goroutines,它可以与初始化代码同时运行。但是,初始化总是对init函数进行排序:在上一个init返回之前,它不会启动下一个init

票数 37
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17733220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档