Repository navigation
01 naming conventions
omeyang edited this page Sep 16, 2026
·
1 revision
本文档定义 Go 项目中包、文件、类型、函数、变量等命名的统一规范。
- 见名知义 - 不看注释就知道用途
- 简短准确 - 避免冗长,但必须准确
- 禁止泛化 - 不用 manager/service/handler/util 等模糊词
- 避免包名重复 - 导出名不要包含包名
- 符合 Uber Go 规范
导出的类型、函数、接口名不要包含包名,因为调用时会重复。
// 错误:包名重复
package user
type UserRepository interface { ... }
func QueryUser(id string) { ... }
// 调用时:
user.UserRepository // 重复了 User
user.QueryUser() // 重复了 User// 正确:简洁清晰
package user
type Repository interface { ... }
func Query(id string) { ... }
// 调用时:
user.Repository // 清晰
user.Query() // 简洁- 小写字母
- 简短(1~2 个单词)
- 单数形式
- 无下划线、无驼峰
user
config
order
eventchange
users // 不用复数
userManager // 不用驼峰
user_config // 不用下划线
utils // 太泛化
- kebab-case(短横线分隔)
- 见名知义
- 避免缩写
order-handler.go
query-by-id.go
branch-tree.go
orderHandler.go // 不用驼峰
order_handler.go // 不用下划线
oh.go // 不用缩写
utils.go // 太泛化
- PascalCase
- 名词或名词短语
- 准确描述用途
- 禁止 Manager/Service/Handler 后缀
- 不要包含包名
// 在 order 包中
type Matcher struct { ... } // 调用:order.Matcher
type Repository struct { ... } // 调用:order.Repository
type Validator struct { ... } // 调用:order.Validator// 在 order 包中
type OrderMatcher struct { ... } // 包名重复
type OrderRepository struct { ... } // 包名重复
type OrderManager struct { ... } // 太泛化 + 包名重复
type Handler struct { ... } // 完全不知道干什么
type Data struct { ... } // 太模糊- PascalCase
- 单方法接口用
-er后缀 - 多方法接口用名词
- 不要包含包名
- 不用 I 前缀或 Interface 后缀
package order
type Repository interface { ... } // 调用:order.Repository
type Matcher interface { ... } // 调用:order.Matcher
type Finder interface { ... } // 调用:order.Finderpackage order
type OrderRepository interface { ... } // 包名重复
type IRepository interface { ... } // 不用 I 前缀
type RepositoryInterface interface { ... } // 不用 Interface 后缀- PascalCase(公开)/ camelCase(私有)
- 动词开头
- 准确描述操作
- 不要包含包名
package order
func Query(id string) (*Order, error) { ... }
func Create(o *Order) error { ... }
func MatchByGroup(groupID string) ([]*Order, error) { ... }
func validateInput(id string) error { ... }package order
func QueryOrder(id string) { ... } // 包名重复
func Handle(data interface{}) { ... } // 处理什么?
func Process(data interface{}) { ... } // 处理什么?
func Do() { ... } // 做什么?- camelCase
- 简短但清晰
- 缩写全大写(ID/IP/HTTP)
orderID
userIP
httpClient
branchTreeOrderID // 非导出变量不用 PascalCase
orderId // 缩写不全大写
data // 太模糊
temp // 太模糊- PascalCase 或全大写(枚举用 PascalCase)
- 有意义的名字
const MaxRetryCount = 3
const DefaultTimeout = 30 * time.Second
const (
StatusActive = "active"
StatusInactive = "inactive"
)const MAX_RETRY = 3 // 不用全大写+下划线
const max = 3 // 太模糊- 1~2 个字母缩写
- 统一使用相同缩写
func (o *Order) Create() { ... }
func (o *Order) Update() { ... }- 第一个参数
- 命名为
ctx
func Query(ctx context.Context, id string) (*Order, error) { ... }- 命名为
err - 自定义错误类型用
Err前缀
var ErrNotFound = errors.New("not found")
var ErrInvalidInput = errors.New("invalid input")-
Manager- 用具体动作代替(如Matcher、Locator) -
Service- 用具体职责代替(如Repository、Validator) -
Handler- 用具体处理代替(如Querier、Processor) -
Util/Utils- 用具体功能代替(如StringValidator、TimeFormatter) -
Helper- 用具体功能代替 -
Common- 用具体功能代替 -
Base- 用具体功能代替 -
Data- 用具体类型代替
OrderManager -> OrderRepository / OrderMatcher
UserService -> UserRepository / UserValidator
DataHandler -> DataProcessor / DataTransformer
StringUtil -> StringValidator / StringParser
- 包名小写、简短、无下划线
- 文件名 kebab-case
- 类型名 PascalCase、见名知义
- 函数名动词开头、准确描述
- 变量名 camelCase、清晰
- 导出名不包含包名
- 没有使用禁止词(Manager/Service/Handler/Util)
- 缩写全大写(ID/IP/HTTP/URL)
- 接收者名称统一
本页由 Maat 仓库的 scripts/sync-wiki.sh 自动生成,请勿直接编辑。