命名规范

在 Go 的世界里,命名规范(Naming Conventions)非常强调简洁可预测无冗余。Go 的设计者们认为,代码的意图应该通过结构和上下文体现,而不是靠超长的变量名。、

1. Module (模块) 命名

Module路径通常反映了的代码托管地址。

  • 格式: 采用 域名/所有者/项目名
  • 规范: 全小写。
    • 尽量避免中划线(-),除非托管平台(如 GitHub 仓库名)强制要求。
    • 不要在路径中使用版本号(除非是 v2 及以上版本,例如 .../v2)。
  • 示例:
    • github.com/gin-gonic/gin
    • golang.org/x/net

2. Package (包) 命名

Package名是用户在代码中调用你时最常看到的单词,因此它的规范最严格。

  • 全小写: 绝对不要用驼峰式(myPackage)或下划线(my_package)。
  • 简短且具名: 应该是一个简单的名词。例如 net/http 而不是 net/http_client
  • 不要与导入路径重复: * 如果导入路径是 .../util/stringutil,包名最好就叫 stringutil
  • 避免泛泛而谈: 尽量少用 utilcommonbase 这种包名,因为它们没有描述清楚包的具体职责。
  • 示例:
    • 推荐:encoding/json
    • 不推荐:JSONLibraryjson_parser

3. Go File (文件) 命名

Go 源文件的命名相对宽泛一些,但也有不成文的规定:

  • 全小写: 比如 server.go
  • 下划线分隔: 如果文件名由多个单词组成,使用下划线(snake_case),例如 http_client.go
    • 注意:这和 Package 命名不同,Package 不允许下划线,但文件允许。
  • 后缀特殊含义: * _test.go:测试文件。
    • _amd64.go / _windows.go:用于平台特定的构建约束(Build Constraints)。

4. 变量与函数的命名

既然说到了规范,顺带提一下代码内部:

  • Exported (公开): 首字母大写(如 Serve())。
  • Unexported (私有): 首字母小写(如 serve())。
  • 驼峰式: Go 内部变量统一使用驼峰(MixedCaps),而不是下划线。
  • 缩写: 专有名词维持原样。用 ServeHTTP 而不是 ServeHttp;用 userID 而不是 userId

5. vs Java

在 Go 中,命名追求的是代码调用时的丝滑感。请对比以下两种设计:

维度 糟糕的设计 (Java 风格) Go 推荐风格
Module com.company.ProjectUtils github.com/user/utils
Package package TimeHelper package time
文件 TimeHelperUtils.go parse.go
调用效果 TimeHelper.ParseTimeHelper(t) time.Parse(t)

金律: Package 名应该让调用方写起来像在读自然语言。

7. 项目根目录命名

在Go的世界里,项目根目录的“物理名字”和代码里的“逻辑名字”其实是两码事。根目录的文件名(文件夹名)对代码运行几乎没有影响,但对开发者的心理预期和工具链有影响。

7.1. 物理名 vs 逻辑名

假设你在电脑上创建了一个文件夹叫 my-awesome-project,但你在里面运行了go mod init github.com/shinerio/auth-service

  • 物理名: my-awesome-project(硬盘上的文件夹名)。
  • 逻辑名: github.com/shinerio/auth-service(Go 模块的真正身份)。
    结果: 别人导入你的包时,用的是逻辑名。你在代码里引用子包时,起始路径也是逻辑名。你把文件夹改名成 old-project,代码依然能完美编译,因为 Go 只认 go.mod 里的定义。

7.2. 根目录命名的作用

虽然编译器不在乎,但以下场景会让根目录命名变得重要:

  • 默认二进制文件名: 当你在根目录运行 go build 时,Go 会默认使用当前文件夹名作为生成的可执行文件名。如果文件夹叫 order-api,生成的程序就叫 order-api(或 order-api.exe)。
  • Git 仓库一致性: 按照惯例,你的本地目录名应该与远程仓库(如 GitHub)的名字保持一致,否则在多人协作或查看日志时会非常混乱。
  • IDE 识别: 很多 IDE(如 GoLand 或 VS Code)会默认将文件夹名作为项目窗口的标题。

7.3. 根目录的命名规范

虽然没有强制约束,但 Go 社区有一套通用的潜规则

规范 说明 示例
全小写 避免在不同操作系统(Linux vs Windows)下产生大小写不敏感的坑。 user-service
中划线分隔 如果名字很长,推荐使用 -(Kebab-case)。注意:这与包名不同(包名不能有符号)。 payment-gateway
简洁直观 名字应直接反映该 Module 的核心职责。 gin, kubernetes
避免 "go-" 前缀 除非是一个非常通用的库,否则没必要在名字里带 go- 推荐 cache 而非 go-cache

评论