其他
编写、审查或重构 Go 代码时统一命名约定并正确选择标识符名…
在编写、审查或重构 Go 代码,需要决定包名、构造器、结构体、接口、常量、枚举、错误、布尔、接收器、getter/setter、functional options、缩写、测试函数或子测试名时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 48/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 53/100 ×0.15
适用场景
编写、审查或重构 Go 代码时统一命名约通用
解决思路
- 所有 Go 标识符使用 `MixedCaps` 或 `mixedCaps`,永远不要用下划线;例外仅限测试函数子用例(如 `TestFoo_InvalidInput`)、生成代码和 OS/cgo interop。
- 用大小写控制可见性:导出名用 `UpperCamelCase`,未导出名用 `lowerCamelCase`。
- 包名用小写、单个单词,测试文件可用 `_test` 后缀;包名用单数,如 `net/url` 而不是 `net/urls`。
- 文件名用小写,允许下划线,如 `user_handler.go`。
- 导出名用 `UpperCamelCase`,如 `ReadAll`、`HTTPClient`。
- 未导出名用 `lowerCamelCase`,如 `parseToken`、`userCount`。
- 接口名用方法名加 `-er` 后缀,如 `Reader`、`Closer`、`Stringer`。
- 结构体名用 `MixedCaps` 名词,如 `Request`、`FileHeader`。
- 常量名用 `MixedCaps`,不要用 `ALL_CAPS`,如 `MaxRetries`、`defaultTimeout`。
- 接收者名用 1-2 个字母缩写,如 `func (s *Server)`、`func (b *Buffer)`;同一类型的所有方法保持一致。
- 错误变量用 `Err` 前缀,如 `ErrNotFound`、`ErrTimeout`。
- 错误类型用 `Error` 后缀,如 `PathError`、`SyntaxError`。
- 构造器命名:包只导出一个主类型时用 `New`,如 `ring.New`;包有多个可构造类型时用 `NewTypeName`,如 `http.NewRequest`。
- 布尔字段和方法用 `is`、`has`、`can` 前缀,如 `isReady`、`IsConnected()`;未导出布尔字段不要用裸 `connected` 或 `permission`,导出 getter 保留前缀,如 `IsConnected() bool`。
- 测试函数用 `Test` 加函数名,如 `TestParseToken`。
- 缩写要么全大写要么全小写,如 `URL`、`HTTPServer`、`xmlParser`,不要混写成 `Url`、`Http`、`Json`。
- 带 context 的变体用 `WithContext` 后缀,如 `FetchWithContext`、`QueryContext`,不要用 `FetchCtx`。
- 原地修改的变体用 `In` 后缀,如 `SortIn()`、`ReverseIn()`,以表明会修改接收者。
- 失败会 panic 的错误变体用 `Must` 前缀,如 `MustParse()`、`MustLoadConfig()`。
- 函数式选项用 `With` 加字段名,如 `WithPort()`、`WithLogger()`;全代码库统一用 `With*`,不要混用 `Set*`、`Use*`。
- 枚举 `iota` 用类型名前缀,且零值必须是 unknown 哨兵,如 `StatusUnknown` 在 0、`StatusReady`;不要让 `var s Status` 的零值等于真实状态。
- 命名返回值要有描述性,但仅用于文档,如 `(n int, err error)`。
- 错误字符串全小写(包括缩写),无标点,如 `"image: unknown format"`、`"invalid id"`;sentinel errors 加包名前缀,如 `errors.New("apiclient: not found")`。
- 导入别名要短,只在冲突时使用,如 `mrand "math/rand"`、`pb "app/proto"`;不要给不需要的导入加别名。
- 格式化函数用 `f` 后缀,如 `Errorf`、`Wrapf`、`Logf`;接受格式字符串的包装函数也要带 `f` 后缀,如 `Wrapf` 而不是 `Wrap`。
- 测试表字段用 `got`/`expected` 前缀,如 `input string`、`expected int`。
- 避免 stuttering:名称不要重复包名、类型名或上下文已存在的信息。
- 在 `http` 包中用 `http.Client` 而不是 `http.HTTPClient`;用 `json.Decoder` 而不是 `json.JSONDecoder`。
- 构造器不要重复类型名:单主类型用 `user.New()` 而不是 `user.NewUser()`;解析函数用 `config.Parse()` 而不是 `config.ParseConfig()`。
- 在 `package sqldb` 中用 `type Connection struct{}` 而不是 `DBConnection`。
- 对所有导出类型也避免 stuttering:在 `package dbpool` 中用 `type Pool struct{}` 而不是 `DBPool`,用 `type Status struct{}` 而不是 `PoolStatus`,用 `type Option func(*Pool)` 而不是 `PoolOption`。
- 不要用 `ALL_CAPS` 常量;Go 的大小写用于可见性而不是强调,改用 `MixedCaps`,如 `MaxRetries`。
- getter 省略 `Get`,因为 `user.Name()` 在调用处读起来自然;布尔谓词保留 `Is`/`Has`/`Can` 前缀,如 `IsHealthy() bool` 而不是 `Healthy() bool`。
- 不要用 `this` 或 `self` 作为接收者;用 1-2 个字母缩写减少视觉噪音。
- 不要创建 `util`、`helper` 这类无信息包名;用能描述抽象的具体名称。
- 不要用 `userSlice` 这类把实现细节放进类型名;用 `users` 描述内容,而不是存储方式。
- 同一类型的所有方法使用同一个接收者名;不要在不同方法间切换接收者名。
- 标识符不要用 `snake_case`;用 `mixedCaps`。
- 名称长度与作用域匹配:3 行循环里用 `i` 可以,包级变量用更长名称;不要让短作用域背负长名字。
- 不要按值命名常量;按角色命名,如 `DefaultPort` 能在端口变化后继续成立,`Port8080` 不能。
- context 变体使用 `WithContext` 后缀,如 `FetchWithContext()`,这是 Go 标准后缀。
- 原地修改函数用 `In` 后缀;否则读者会假设函数返回新值,如 `SortIn()` 表示修改。
- 会 panic 的函数用 `Must` 前缀,提醒调用者失败会 panic。
- 不要混用 `With*`、`Set*`、`Use*` 表示 functional options;统一用 `With*`。
- 包名用单数,Go 约定是单数,如 `net/url` 而不是 `net/urls`。
- 格式化包装函数带 `f` 后缀,`Wrapf` 而不是 `Wrap`,让调用者知道要传格式参数。
- 不要为了不需要的导入加别名;别名只在冲突时加,避免认知负担。
- 同一概念用同一个词;不要用 `user`、`account`、`person` 混指同一概念。
- 测试子用例名在 `t.Run()` 中全小写描述短语,如 `"valid id"`、`"empty input"`,不是 `"valid ID"` 或 `"Valid Input"`。
- 应用命名修复时,用 `samber/cc-skills-golang@golang-gopls` 的安全 rename,更新所有调用点并拒绝破坏接口满足的 rename;不要用 grep/sed 或手动 Edit 静默漏改。
- 用 linter 自动检查命名:`revive`、`predeclared`、`misspell`、`errname`;配置见 `samber/cc-skills-golang@golang-lint`。
- 要忽略某条规则时,在代码中加注释说明。
- 遵循原则:清晰胜于聪明;设计架构、命名组件、记录细节。
适用边界 · 注意事项
- 不适用于不涉及命名决策的一般 Go 实现问题。
- 当公司技能显式覆盖并取代本技能时,不要使用本技能。
- 不适用于非 Go 项目或不涉及 Go 命名约定的场景。