go:如果无法删除src中的源文件,为什么需要pkg目录?

go:如果无法删除src中的源文件,为什么需要pkg目录?,go,Go,我编写了一个函数(not!main)并提示去安装。此命令在my pkg目录中生成一个路径和一个包。我在一个主函数中使用它来测试这个函数,生成了.exe,一切都很好。 在那之后,我想看看我是否正确理解了go中包的概念,并删除了src目录中函数的源文件,删除了main.exe。我没有删除我的pkg目录中的包文件。然后我尝试再次安装main.exe,但没有成功:“包找不到”。我显然误解了整个概念,因为我认为我可以在pkg中使用包,而不用src中的源文件。如果我的结论是正确的,为什么我需要“pkg”目录

我编写了一个函数(not!main)并提示
去安装。此命令在my pkg目录中生成一个路径和一个包。我在一个主函数中使用它来测试这个函数,生成了.exe,一切都很好。
在那之后,我想看看我是否正确理解了go中包的概念,并删除了src目录中函数的源文件,删除了main.exe。我没有删除我的pkg目录中的包文件。然后我尝试再次安装main.exe,但没有成功:“包找不到”。我显然误解了整个概念,因为我认为我可以在pkg中使用包,而不用src中的源文件。如果我的结论是正确的,为什么我需要“pkg”目录呢


In/bin是主函数“hello”的二进制代码。此主函数还包含“stringutil”包的函数“reverse”

通过生成“hello.exe”,Go还将包“stringutil”生成到pkg中

我的问题是:我应该不能删除src中的“reverse.go”并且仍然能够使用相同的函数,因为它已经被放入pkg中了吗


现在他们已经用go重写了编译器,这就是AST的工作方式吗?它检查GOPATH/src/**/.go当它解析“导入”时,然后当链接器开始构建最终的二进制文件时,它将检查pkg。因此,由于源代码树不完整,编译器在尝试将ast提供给汇编程序时首先会出错


非常感谢

pkg dir只是一个用于编译的本地缓存,它不是您可以依赖的东西,也不能替换.go文件,它不是一个静态lib dir,而是一个temp build products dir。它加快了编译速度,因此您不需要pkg dir,但如果pkg dir为空,则编译速度可能会变慢,这是供编译器使用的,而不是供您使用的

正如您所发现的,您确实需要src dir


要将静态库链接到您的项目,您可以复制该.a文件并使用ldflags进行链接,但这样会丢失所有好东西,例如交叉编译和拥有应用程序的整个源代码,因此与c不同,例如,人们通常不会这样做。

的确,pkg dir通常用作缓存目录,但是也可以在没有可用源代码的情况下使用包,它有一个名为AFAIK的特性,它是从Go1.7开始实现的。 但是,这种方法有一个警告:用于构建包的编译器版本和用于“使用”包生成新库/可执行文件的编译器版本必须匹配。此外,文件必须与要构建的操作系统/体系结构对相匹配。如果您想要交叉编译,您需要将包分发到您想要构建的每一对操作系统/体系结构

project为上述功能提供了一个演示


我希望我的解释足够详细:)

当然,你可以删除源文件,只使用pkg中的.a文件:你所要做的就是手动调用Go编译器和链接器,而不是通过
Go工具
。您遇到的是
go
工具如何工作,与go作为一种语言或“软件包如何工作”无关。在功能的介绍中提到了这一点,但没有人们想要的那么详细