我目前正在开始使用 Go,并且已经深入研究了有关包命名和工作区文件夹结构的注意事项。
不过,我不太确定如何根据 Go 范式正确组织我的代码。
这是我当前的结构示例,它位于 $GOPATH/src
中:
github.com/myusername/project
|-- main.go
+-- internal
+---- config
|------ config.go
所以我有一个名为 project
的项目,它使用 config
包,而该包又以一种只应由 project 使用的方式专门化
。因此,我不希望它位于 github.com/myusername/config
下,对吗?
现在的问题是,使用内部包结构是否“好”,或者我应该将我的项目特定包放在 github.com/myusername/$pkgname
下并以某种方式表明它属于到 project
(例如,将其命名为 projectconfig
)?
最佳答案
如果您的项目只生成一个程序,那么最常见的结构就是您提到的结构。
如果您的项目产生多个程序,通常的做法是使用如下结构:
<project>/
cmd/
prog1/
main.go
prog2/
main.go
如果您的项目将 Go 代码公开为库供第三方使用,最常见的结构是使用项目的根目录公开域模型和 API。
<project>/
model.go
api.go
这适用于第三方代码,只需导入“github.com/user/project”并提供可用的模型和 api。
常见的是第二个和第三个选项的组合。
拥有用于封装依赖项使用的包也被认为是一种很好的做法。例如。假设你的项目使用 Elasticsearch 客户端
<project>/
cmd/
prog1/
main.go
elastic/
impl.go
dao.go
model.go
所以在 dao.go 中你定义了 dao 的 API,然后在 elastic/impl.go 中你(导入弹性库、域模式和)根据弹性定义 DAO 的实现。最后,您从生成实际程序的 main.go 导入所有内容。
参见 this关于这个问题的精彩而简短的介绍。
关于go - 单个 go 项目使用的 go 包的正确文件夹结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41533693/