Go命名约定实用指南
核心摘要
选择正确的名称是Go编程的重要(有时困难!)部分。好名称使代码更清晰、更可预测、更易导航;坏名称则相反。Go有相当强的约定和一些硬规则。
标识符规则
硬规则
- 可包含:Unicode字母、数字、下划线
- 不能以数字开头
- 不能使用Go关键字(如func, struct, if, for等)
命名风格
| 类型 | 规则 | 示例 |
|---|---|---|
| 非导出标识符 | camelCase | orderTotal |
| 导出标识符 | PascalCase | FetchUser |
| 避免 | snake_case, SCREAMING_SNAKE | - |
缩写词规则
- 缩写词(API, URL, HTTP, ID)保持大小写一致
apiKey或APIKey✓ApiKey✗- ID作为"identity/identifier"缩写时用全大写:
userID
避免冲突
- 避免与内置类型冲突:int, bool, any
- 避免与内置函数冲突:min, max, len, clear
- 避免与标准库包名冲突:json, url, log, time等
- 避免在标识符中包含类型名(除非需要区分转换后的变量)
导出与隐藏
- 首字母大写 = 导出(对包外可见)
- 首字母小写 = 非导出(仅包内可见)
- 默认不导出,只在需要时导出
- main包的标识符通常应全部非导出
- 引用The Pragmatic Programmer:"写害羞的代码"
标识符长度
- 作用域小(短函数、循环内):可用短名如
i,p - 作用域大(跨函数使用):用描述性名称如
count,sum - 原则:离声明越远,越需要描述性名称
包命名
| 规则 | 示例 |
|---|---|
| 小写ASCII字母+数字 | orders, customer |
| 短而好打 | slug, http |
| 避免 | common, util, helpers, types |
| 避免 | vendor, testdata, internal(特殊目录名) |
文件命名
- 理想:一个词、小写、总结文件内容
- 两词可用
routingindex.go或routing_index.go - 保持一致即可,个人偏好无下划线
- 特殊后缀:_test.go, _linux.go, _darwin.go, _windows.go
避免冗余
导出函数时,避免重复包名。如orders.NewOrder()而非orders.NewOrders()