使用子/子包构建包结构

时间:2013-01-19 18:19:35

标签: go package-structuring

我正试图在Go中制作一个简单的计算器。我正在设计它,我可以先构建一个命令行界面,然后在GUI界面中轻松交换。项目位置为$GOPATH/src/gocalc(此后所有路径均相对于项目位置)。命令行界面逻辑存储在文件gocalc.go中。计算器逻辑存储在文件calcfns/calcfns.gooperations/operations.go中。除gocalc.go

中的主程序package main外,所有文件的包名都与其文件名相同(无扩展名)

calcfns.go通过operations.go导入import "gocalc/operations"; gocalc.go通过calcfns.go

导入import "gocalc/calcfns"

总结:

  • $GOPATH/src/gocalc/
    • gocalc.go
      • package main
      • import "gocalc/calcfns"
    • calcfns/
      • calcfns.go
        • package calcfns
        • import "gocalc/operations"
    • operations/
      • operations.go
        • package operations

当我尝试go build operations(来自项目目录)时,我收到回复:can't load package: package operations: import "operations": cannot find package 当我尝试go build gocalc/operations时,我得到can't load package: package gocalc/operations: import "gocalc/operations": cannot find package 当我尝试go build operations/operations.go时,它编译得很好

当我尝试go build calcfnsgo build gocalc/calcfns时,我会收到can't load package...条消息,类似于操作中的消息;但是,当我尝试构建calcfns/calcfns.go时,它会对import语句产生阻塞:import "gocalc/operations": cannot find package

最后,当我从项目目录中尝试go build .时,它会与上一段相似:import "gocalc/calcfns": cannot find package

我应该如何构建我的子包和/或导入语句,使go build不会失败?

3 个答案:

答案 0 :(得分:7)

愚蠢的是,我忘了导出我的GOPATH变量,因此go env""显示了GOPATH。 (感谢jnml建议打印go env; +1)。

执行此操作(并将主程序移动到其自己的文件夹{project-dir}/gocalc/gocalc.go)后,我可以通过go install gocalc/gocalc构建/安装程序。

故事的道德,确保在设置$ GOPATH环境变量时键入export GOPATH=...而不是GOPATH=...

答案 1 :(得分:1)

请尝试添加$ go env的输出以提供更多线索。否则,目录结构和(显示的)import语句看起来都没问题。

然而句子

  

当我尝试去构建操作时(从项目目录开始),我得到了响应:无法加载包:包操作:导入“操作”:找不到包

听起来很奇怪。似乎暗示你有

package operations

import "operations"
在'operations.go'中的

,那将是罪魁祸首......?

答案 2 :(得分:-1)

非常简单:

假设我有一个名为UITableView

的项目/应用
  1. 将根目录放在golang-playground下,在我的情况下GOPATH/src/(运行命令GOPATH=~/go/src以获取go env)。我的应用的完整路径是GOPATH enter image description here

  2. 假设您要在我的~/go/src/golang-playground文件中使用文件Index()中的函数router.go(当然这是在根目录上)。所以在main.go中:

    main.go