【发布时间】:2018-02-05 00:05:29
【问题描述】:
我写了一个函数(不是!main)并提示go install。该命令在我的 pkg-directory 中生成了一个路径和一个包。我通过在 main 函数 中使用它来测试该函数,生成了 .exe,一切正常。
之后我想看看我对go中的packages的概念理解有没有正确,把src-directory中函数的源文件删掉,把主.exe。我确实没有删除了我的 pkg-directory 中的包文件。然后我再次尝试go install main .exe,但没有成功:“找不到包”。我显然误解了整个概念,因为我认为我可以使用 pkg 中的包,而无需 src 中的源文件。如果我的结论是正确的,为什么我需要“pkg”目录呢?
For more explanation take a look at this picture please:
/bin 中是主函数“hello”的二进制代码。这个主函数还包含“stringutil”包的“reverse”函数。
通过生成“hello.exe”,Go 还将包“stringutil”生成到 pkg 中。
我的问题是:我是否应该无法删除 src 中的“reverse.go”,并且仍然可以使用相同的功能,因为它已经放入了 pkg?
现在他们已经重写了编译器,AST 的工作方式是这样的吗?它在解析“导入”时检查 GOPATH/src/**/.go,然后当链接器去构建最终的二进制文件时,它会去检查 pkg。因此,由于源代码树不完整,编译器在尝试将 ast 提供给汇编器时首先出错。
非常感谢!!!
【问题讨论】:
-
当然你可以删除源文件并只使用 pkg 中的 .a 文件:你所要做的就是手动调用 Go 编译器和链接器,而不是通过
go tool。您遇到的是go工具的工作方式,与 Go 作为一种语言或“包的工作方式”无关。
标签: go