我了解Go Modules仍是一项试验性的选择加入功能,也许正因为如此,我无法找到有关如何命名目录和package
的明确指南。
在这些Package names in Go Blog帖子和Package name in Effective Go中,他们谈到该目录应与程序包名称匹配-但我不确定Go Modules是否遵循相同的模式。
如果我想将我的业务逻辑捆绑在package business
中并包含许多文件,那么创建子目录validators/
并保持相同的程序包名称package business
是否合理?
someDir
├── business
│ ├── businessA.go // package business
│ ├── businessB.go // package business
│ ├── businessC.go // package business
│ ├── go.mod // module example.com/business
│ └── validators
│ ├── businessValidatorX.go // package business, or validators?
│ ├── businessValidatorY.go // package business, or validators?
│ └── businessValidatorZ.go // package business, or validators?
└── main.go
如果我要使用相同的软件包名称:
// main.go
package main
import (
"example.com/business"
"example.com/business/validators"
)
// both imports would be combined to the same `business` package?
func main() {
b := business.SomeLogic()
business.ValidateX(b) // validator from the same package
}
这似乎容易导致出口冲突-但很简单。
如果validators/
路径映射到package validators
,那么使用的代码将如下所示。
// main.go
package main
import (
"example.com/business"
"example.com/business/validators"
)
func main() {
b := business.SomeLogic()
validators.ValidateX(b) // validator from a separate package
}
我应该如何管理包含许多文件的软件包?方法1.是否合理,尽管与上面的博客文章和文档有些矛盾?
还是应该采用方法2,遵守约定,并根据需要在main.go
中添加别名?
答案 0 :(得分:1)
作为Go的新手,我错误地认为方法1是一种可能的方式,因为Go允许包名称不同于目录名称。
Volker在评论中提供了帮助,方法1 绝对不可能。
尝试合并软件包时,会直接出现编译错误。
Go模块的引入不会影响现有文档中概述的最佳实践,例如:
作为旁注,我还知道包名称应为单数形式。
因此,剩下的就是以下结构以及方法2 :