13

我知道Go Modules仍然是一个实验性的选择加入功能,也许正因为如此,我找不到关于如何命名目录和packages 的明确指导。在Go 博客文章中的
这些包名称和Effective Go 中的包名称中,他们谈到目录应该与包名称匹配 - 但我不确定 Go 模块是否会遵循相同的模式。

如果我想将我的业务逻辑与许多文件捆绑在一起,创建子目录并保持相同的包名package business是否合理?validators/package business

someDir
├── business
│   ├── businessA.go // package business
│   ├── businessB.go // package business
│   ├── businessC.go // package business
│   └── validators
│       ├── businessValidatorX.go // package business, or validators?
│       ├── businessValidatorY.go // package business, or validators?
│       └── businessValidatorZ.go // package business, or validators?
├── go.mod   // module example.com
└── main.go

方法 1。

如果我要使用相同的包名:

// 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
}

这看起来很容易发生出口冲突 - 但它很简单。

方法2。

如果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

4

1 回答 1

5

方法2是正确的。

作为 Go 新手,我错误地认为方法 1 是一种可能的方式,因为 Go 确实允许包名与目录名不同。

正如沃尔克在评论中提供的帮助,方法 1绝对是不可能的
尝试组合包时,您将得到一个直接的编译错误。

编译错误

Go Modules 的引入不会影响现有文档中概述的最佳实践,例如:

作为旁注,我也开始知道包名应该是单数形式。

因此,这将使我得到以下结构以及方法 2

遵循约定的结构

于 2018-11-22T22:59:21.777 回答