【问题标题】:Error "can't load package: package my_prog: found packages my_prog and main"错误“无法加载包:包 my_prog:找到包 my_prog 和 main”
【发布时间】:2013-01-19 16:21:10
【问题描述】:

在我的 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.go 我有package 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 的文件都应该放在自己的文件夹中?如果有,这是什么原因?

【问题讨论】:

    标签: go


    【解决方案1】:

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

    源结构在How to Write Go Code 中定义。

    包是一种组件,您可以在多个程序中使用,您可以发布、导入、从 URL 获取等。因此,与程序一样拥有自己的目录是有意义的一个目录。

    【讨论】:

    • 是的,但是包 main 有资格作为独立包吗?据我了解,包 main 是提供入口点的语言的一种怪癖(很像 Java 的具有公共静态 main 的类)。
    • 是的,它就是这样工作的。在实践中,我在我的“主”包中放入了很少的代码,只有一个不能在其他程序中使用的代码。
    • 坦率地说这很烦人。我认为没有理由将主入口点与程序的其余部分分开。我会接受这个答案。
    • 当我做一个程序时,我经常有很多小工具使用相同的数据/模型/等等。把所有的东西都分解成包,让所有的程序都非常小并使用这些包是很方便的。顺便说一句,您可以在接受答案之前稍等片刻,这样其他用户就会有动力给您其他(也许更好的)答案。
    • 我还没有尝试安装任何东西,只是构建程序。该程序依赖于这两个包。我发现将 main 包放在 /src/my_prog/ 中,将 my_prog 包放在 /src/my_prog/my_prog/ 中是可行的。
    【解决方案2】:

    另外,如果您只想将 main.go 文件拆分为多个文件,则只需将其他文件命名为“package main”,只要您仅在其中一个文件中定义 main 函数,您很好。

    【讨论】:

      【解决方案3】:

      确保您的包已安装在您的 $GOPATH 目录中或已安装在您的工作区/包中。

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

      【讨论】:

        猜你喜欢
        • 2023-03-27
        • 1970-01-01
        • 2017-02-05
        • 1970-01-01
        • 2018-01-15
        • 1970-01-01
        • 2022-01-15
        • 2020-12-19
        • 1970-01-01
        相关资源
        最近更新 更多