我有一个像这样的目录结构:
Animal/
dog/
chiwawa.go
rabbit.go
chiwawa.go
和rabbit.go
都打包命名为:“package animal”位于文件顶部。但是,当我尝试在var Food = apple
中使用chiwawa.go
中的变量rabbit.go
时,我收到错误 - undefined: Food
。
如果chiwawa.go
直接放在Animal
下没有dog
目录,我就没有任何问题。
这是故意在Go吗?我可以在保留包名和目录结构的同时解决这个问题吗?
答案 0 :(得分:0)
go工具旨在使用维护的开源代码 公共存储库。虽然您不需要发布您的代码,但是 无论你是如何设置环境的模型都是一样的 或不。
Go代码必须保存在工作区内。工作空间是目录 从根开始有三个目录的层次结构:
- src包含组织到包中的Go源文件(每个目录一个包),
- pkg包含包对象,
- bin包含可执行命令。
go工具构建源包并安装生成的二进制文件 到pkg和bin目录。
src子目录通常包含多个版本控制 跟踪开发的存储库(例如Git或Mercurial) 一个或多个源包。
为了让您了解工作区在实践中的外观,这里是一个 例如:
bin/ hello # command executable outyet # command executable pkg/ linux_amd64/ github.com/golang/example/ stringutil.a # package object src/ github.com/golang/example/ .git/ # Git repository metadata hello/ hello.go # command source outyet/ main.go # command source main_test.go # test source stringutil/ reverse.go # package source reverse_test.go # test source
此工作空间包含一个包含两个的存储库(示例) 命令(hello和outyet)和一个库(stringutil)。
典型的工作区将包含许多包含的源存储库 许多包和命令。大多数Go程序员都保留他们的Go 单个工作区中的源代码和依赖项。
对于Go工具,Go包的所有Go源文件应该在同一目录中。
答案 1 :(得分:0)
这是故意的。 Go中的包使用目录路径导入。所以,“动物”和“动物/狗”是两个不同的包,即使你给它们相同的包名。
为了证明这一点,我编写了以下示例文件集:
~/go/src/test/
├── animal
│ ├── animal.go
│ └── dog
│ └── dog.go
└── test.go
动物/ animal.go
package animal
type Species string
动物/狗/ dog.go
package animal
// In package "animal" importing a package "animal"
import "test/animal"
type Dog struct {
Species animal.Species
Breed string
}
test.go
package main
import (
"fmt"
"test/animal/dog"
)
func main() {
d := animal.Dog{}
fmt.Printf("%#v", d)
}
请注意dog.go导入“test / animal”包并将其引用为“animal”。
另外请注意test.go导入“test / animal / dog”以访问“Dog”结构类型。如果它导入“test / animal”,则会生成错误(undefined:animal.Dog)。