猿问

为什么 Go 编译器只需要包含您直接导入的包?

我一直在使用 Go,并在某些地方读到 Go 编译器只需要包含您直接从main.
因此,与指数级的 C++ 相比,解决依赖性所需的时间是线性的。这是如何运作的?
如果main导入包alpha又导入包beta,那么 Go 编译器不需要编译整个树吗?

aluckdog
浏览 100回答 1
1回答

大话西游666

Go 编译器首先将单个包编译成单个目标文件。在这个阶段,它只需要解析import它在它编译的包中找到的所有。对于你的包的目标文件,只有调用同一个包或直接导入,所以这里没有问题。一个单独的链接阶段将所有目标文件链接在一起。在编译包的文档中对此有一个很好的解释:编译,通常被调用为“go tool compile”,编译一个包含命令行上命名的文件的 Go 包。然后它写入一个单一的目标文件,该文件以第一个源文件的基本名称命名,后缀为 .o。然后目标文件可以与其他目标文件组合成包存档或直接传递给链接器(“go tool link”)。如果使用 -pack 调用,编译器会直接写入存档,绕过中间目标文件。生成的文件包含有关包导出的符号的类型信息以及有关包从其他包导入的符号使用的类型的信息。因此在编译包 P 的客户端 C 时不需要读取 P 的依赖文件,只需读取 P 的编译输出。
随时随地看视频慕课网APP

相关分类

Go
我要回答