在 Go 的世界里,命名规范(Naming Conventions)非常强调简洁、可预测且无冗余。Go 的设计者们认为,代码的意图应该通过结构和上下文体现,而不是靠超长的变量名。、
1. Module (模块) 命名
Module路径通常反映了的代码托管地址。
- 格式: 采用
域名/所有者/项目名。 - 规范: 全小写。
- 尽量避免中划线(
-),除非托管平台(如 GitHub 仓库名)强制要求。 - 不要在路径中使用版本号(除非是 v2 及以上版本,例如
.../v2)。
- 尽量避免中划线(
- 示例:
github.com/gin-gonic/gingolang.org/x/net
2. Package (包) 命名
Package名是用户在代码中调用你时最常看到的单词,因此它的规范最严格。
- 全小写: 绝对不要用驼峰式(
myPackage)或下划线(my_package)。 - 简短且具名: 应该是一个简单的名词。例如
net/http而不是net/http_client。 - 不要与导入路径重复: * 如果导入路径是
.../util/stringutil,包名最好就叫stringutil。 - 避免泛泛而谈: 尽量少用
util、common、base这种包名,因为它们没有描述清楚包的具体职责。 - 示例:
- 推荐:
encoding/json - 不推荐:
JSONLibrary或json_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 |
评论