Go Modules - 目录和包的命名约定

Ryo*_*ota 10 module go go-modules

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

如果我想将我的业务逻辑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
Run Code Online (Sandbox Code Playgroud)

方法一。

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

// 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
}
Run Code Online (Sandbox Code Playgroud)

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

方法二。

如果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
}
Run Code Online (Sandbox Code Playgroud)

我应该如何管理由多个文件组成的包?方法 1. 是否合理,尽管它与上面的博客文章和文档有些矛盾?
或者我应该使用方法 2.,遵守约定,并根据需要在main.go?

Ryo*_*ota 10

方法2是正确的。

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

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

编译错误

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

作为旁注,我还知道包名称应该是单数形式。

这样我就得到了以下结构以及方法 2:

遵循惯例的结构

  • 但是:从技术上讲这是不正确的。无需使用“go”工具构建代码,而是可以手动调用编译器和链接器(或者通常通过 makefile 或其他构建工具),这允许将任意文件组合到一个包中。没有哪个理智的人会这么做,因为这会破坏世界上每一个 Go 工具,但这是可能的,而且已经完成了。 (2认同)