go:如果我不能删除src中的源文件,为什么还需要pkg目录?

时间:2017-08-27 15:59:09

标签: go

我写了一个函数(!main)并提示go install。此命令在 pkg-directory 中生成了路径和包。我在主函数中使用它测试了该函数,生成了.exe,一切正常。 之后,我想看看我是否正确理解了 go 中的包的概念,并删除了 src-directory 中函数的源文件并删除了 main .exe 。我删除了 pkg-directory 中的包文件。然后我再次尝试go install main .exe ,但它没有工作:"无法找到包"。我显然很少理解整个概念,因为我认为我可以使用 pkg 中的软件包而不使用 src 中的源文件。如果我的结论是正确的,为什么我需要" pkg"目录在哪?

For more explanation take a look at this picture please:

in / bin是主函数" hello"的二进制代码。这个主要功能还包含功能"反向" " stringutil"包。

通过生成" hello.exe",Go也会生成包" stringutil"进入pkg。

我的问题是:我是否应该删除" reverse.go"在src中仍然可以使用相同的函数,因为它已经被放入pkg了?

现在它是AST的工作方式,他们在go中重写了编译器吗?它检查GOPATH / src / ** /。去解析"导入"然后当链接器去构建最终的二进制文件时,它会检查pkg。因此,当因为源树不完整而尝试将ast提供给汇编程序时,编译器会首先出错。

非常感谢!!!

2 个答案:

答案 0 :(得分:2)

pkg目录通常用作缓存目录,但是也可以使用包而不使用源代码,使用名为binary only packages AFAIK的功能自Go 1.7开始实现。 但是,这种方法有一个警告:用于构建包的编译器的版本和用于“使用”包生成新库/可执行文件的编译器必须匹配。此外,文件必须与要构建的os / architecture对匹配。如果你想要交叉编译,你需要将你的包分发给你想要构建的每对os / architecture。

This项目有上述功能的演示。

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

答案 1 :(得分:0)

pkg dir只是一个用于编译的本地缓存,它不是你可以依赖的东西而且它不会取代.go文件,它不是一个静态的lib目录,而是一个临时构建产品目录。它加速了编译,所以你不需要pkg目录,但如果它是空的,编译可能会更慢,而且它是供编译器使用的,而不是你的。

正如您所发现的那样,需要src dir。

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