错误“无法加载软件包:软件包my_prog:找到软件包my_prog和main”


75

在我的GOPATH中,我有类似以下内容:

/bin/
/pkg/
/src/
/src/my_prog/
/src/my_prog/main.go
/src/my_prog/d_interface.go
/src/my_prog/d_struct_that_implements_the_interface.go

main.gopackage main,在d_interface.god_struct_that_implements_the_interface.go我有package my_prog

当我尝试go build my_prog出现以下错误时:

can't load package: package my_prog: found packages my_prog (d_interface.go) and main (main.go) in C:\dev\Code\Go\src\my_prog

这是否意味着任何属于的文件都package main应该放在其自己的文件夹中?如果是这样,原因是什么?

Answers:


77

是的,每个程序包必须在其自己的目录中定义。

源结构在如何编写Go代码中定义。

程序包是一个组件,可以在多个程序中使用该组件,可以对其进行发布,导入,从URL获取等。因此,拥有一个自己的目录和一个程序可以拥有的目录一样有意义。


是的,但是主包是否有资格作为独立包?据我了解,包main是提供入口点的语言的一种怪癖(很像具有公共静态main的Java类)。
TheTeaMan

是的,就是这样。在实践中,我只在“主”包中放入了很少的代码,只有那些不能在其他程序中使用的代码。
DenysSéguret13年

8
坦率地说,这很烦人。我看不出将主入口点与程序其余部分分开的理由。我会接受这个答案。
TheTeaMan

在编写程序时,我经常会使用相同的数据/模型/等来拥有许多小型实用程序。将包中的所有内容都破坏掉并使所有程序都非常小并使用这些包很方便。顺便说一句,您可以在接受答案之前稍等片刻,以便其他用户有动力为您提供其他(可能更好)的答案。
DenysSéguret13年

2
我还没有尝试安装任何东西,只是在构建程序。该程序取决于两个软件包。我发现将主程序包/src/my_prog/和my_prog程序包一起/src/my_prog/my_prog/使用即可。
TheTeaMan

17

另外,如果您要做的只是将main.go文件分解为多个文件,则只要将其他文件命名为“ package main”,只要您仅在其中一个文件中定义main函数即可,走。


2

确保您的软件包安装在$GOPATH目录中或已经在工作空间/软件包中。

例如:如果您的$GOPATH = "c:\go",请确保里面的包C:\Go\src\pkgName

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.