,我是 golang 新手,目前正在研究包和导入它们的工作原理。我对这次进口有几个问题。我正在阅读这篇文章(它有超过 7k 个赞,所以我猜它是准确的 + 这是当我输入
golang 包
时 google 给我的第一个内容)。,为了解释我不明白的地方,我先写一下项目结构是什么样的,所有文件的内容是什么。,如您所见,我有包含 3 个包的模块(4 个包包括主包)。下面列出了所有包的内容。,pkg1.go 的内容:,pkg2.go 的内容:,mypkg 的内容:,main.go 的内容:,因此,main.go
包含 pkg1
和 pkg2
,并且 pkg1
和 pkg2
都包含 mypkg
。我引用的文章指出了以下内容(以粗体显示):,考虑到这一点,我期望我的程序的输出是这样的:,我的期望是遵循以下步骤:,进入主包(1)pkg1 包已初始化 (2),mypkg 包已初始化 (2.1),mypkg 中的所有全局变量均已初始化 –
prom
在我的情况下 (2.1.1)调用 mypkg 的 init 函数(2.1.2),调用 pkg1 的 init 函数(2.2),pkg2 包已初始化 (3),mypkg 包已初始化 (3.1),mypkg 中的所有全局变量均已初始化 –
prom
在我的情况下 (3.1.1)调用 mypkg 的 init 函数(3.1.2),调用pkg2的init函数(3.2),主包初始化(4)
调用main的init函数(5)
主包的main函数被调用(6),取而代之的是,我得到以下输出:,看起来 mypkg 在第一次导入期间只初始化了一次?!另外,全局变量
prom
在 pkg1 和 pkg2 中的地址是相同的(在本例中为 0x8fe360
)。,所以我的问题是:,我知道对于某些人来说这些问题是关于 golang 的一些基础知识,但对于我作为初学者来说这引起了一些误解。更重要的是,该程序的工作结果与谷歌搜索中首先出现的文章的作者所写的内容不符。欢迎任何帮助。祝一切顺利!,程序中包含的包是一个集合,它是从 main
开始的所有导入包的传递闭包。即:,这是一套。每个导入的包仅包含一次。这意味着,如果您在包中定义了一个变量,则该变量仅出现一次。所有导入的包以及它们递归导入的包都包含在最终的二进制文件中。,至于初始化:您的步骤是正确的,只是
mypkg
只初始化一次。二进制文件中没有 mypkg
的多个副本。,