我写了一个函数(不!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提供给汇编程序时,编译器会首先出错。
非常感谢!!!
答案 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不同例如人们通常不这样做。