Go(Golang)命名规范 — 包括包、构造函数、结构体、接口、常量、枚举、错误、布尔值、接收器、getter/setter、函数等。
公司技能明确取代 Samber/ cc- swilling- golang@ golang- 命名技能优先是一项面向实际任务的技能,主要用于Go Naming Conventions.;Go favors short, 可读名称.;
从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。
执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。
社区默认规范。 若某公司技能明确覆盖
samber/cc-skills-golang@golang-naming技能,则该技能优先生效。
Go 偏好简短、易读的名称。首字母大小写控制可见性:大写表示导出(exported),小写表示未导出(unexported)。所有标识符 必须 使用 MixedCaps 风格,禁止 使用下划线。
“清晰优于巧妙。” — Go 谚语
“设计架构,命名组件,记录细节。” — Go 谚语
如需忽略某条规则,只需在代码中添加注释即可。
| 元素 | 规范 | 示例 |
|---|---|---|
| 包(Package) | 全小写,单个单词 | json、http、tabwriter |
| 文件(File) | 全小写,允许使用下划线 | user_handler.go |
| 导出名称(Exported name) | UpperCamelCase | ReadAll、HTTPClient |
| 未导出名称(Unexported) | lowerCamelCase | parseToken、userCount |
| 接口(Interface) | 方法名 + -er |
Reader、Closer、Stringer |
| 结构体(Struct) | MixedCaps 名词 | Request、FileHeader |
| 常量(Constant) | MixedCaps(非 ALL_CAPS) | MaxRetries、defaultTimeout |
| 接收者(Receiver) | 1–2 字母缩写 | func (s *Server)、func (b *Buffer) |
| 错误变量(Error variable) | Err 前缀 |
ErrNotFound、ErrTimeout |
| 错误类型(Error type) | Error 后缀 |
PathError、SyntaxError |
| 构造函数(Constructor) | New(单一类型)或 NewTypeName(多类型) |
ring.New、http.NewRequest |
| 布尔字段(Boolean field) | is、has、can 前缀(仅限 字段 和方法) |
isReady、IsConnected() |
| 测试函数(Test function) | Test + 函数名 |
TestParseToken |
| 缩略词(Acronym) | 全大写或全小写 | URL、HTTPServer、xmlParser |
| 变体:带上下文(Variant: context) | WithContext 后缀 |
FetchWithContext、QueryContext |
| 变体:原地操作(Variant: in-place) | In 后缀 |
SortIn()、ReverseIn() |
| 变体:错误即 panic(Variant: error) | Must 前缀 |
MustParse()、MustLoadConfig() |
| 选项函数(Option func) | With + 字段名 |
WithPort()、WithLogger() |
| 枚举(Enum,iota) | 类型名前缀,零值为 unknown | StatusUnknown(值为 0)、StatusReady |
| 具名返回值(Named return) | 描述性命名,仅用于文档说明 | (n int, err error) |
| 错误字符串(Error string) | 全小写(含缩略词),无标点符号 | "image: unknown format"、"invalid id" |
| 导入别名(Import alias) | 简短,仅在发生冲突时使用 | mrand "math/rand"、pb "app/proto" |
| 格式化函数(Format func) | f 后缀 |
Errorf、Wrapf、Logf |
| 测试表字段(Test table fields) | got/expected 前缀 |
input string、expected int |
所有 Go 标识符 必须 使用 MixedCaps(或 mixedCaps)。禁止 在标识符中使用下划线 —— 唯一例外是测试函数子用例(如 TestFoo_InvalidInput)、自动生成代码,以及 OS/cgo 互操作场景。这不是风格偏好,而是核心机制:Go 的导出机制依赖大小写,且整个工具链均假设标识符采用 MixedCaps 风格。
// ✓ 正确 MaxPacketSize userCount parseHTTPResponse // ✗ 错误 —— 这些风格与 Go 的导出机制及工具链预期冲突 MAX_PACKET_SIZE // C/Python 风格 max_packet_size // snake_case kMaxBufferSize // 匈牙利命名法
Go 的调用点始终包含包名,因此在标识符中重复包名会浪费读者精力 —— 例如 http.HTTPClient 强迫读者两次解析 “HTTP”。标识符 不得 重复已在包名、类型名或上下文中明确的信息。
// 正确 —— 调用点简洁清晰
http.Client // 非 http.HTTPClient
json.Decoder // 非 json.JSONDecoder
user.New() // 非 user.NewUser()
config.Parse() // 非 config.ParseConfig()
// 在 sqldb 包中:
type Connection struct{} // 非 DBConnection —— “db” 已在包名中体现
// “避免重复”适用于所有导出类型,不仅限于主结构体:
// 在 dbpool 包中:
type Pool struct{} // 非 DBPool
type Status struct{} // 非 PoolStatus —— 调用方写作 dbpool.Status
type Option func(*Pool) // 非 PoolOption
以下规范虽正确但不够直观,是最常见的命名错误来源:
构造函数命名: 当一个包仅导出一个主要类型时,构造函数应命名为 New(),而非 NewTypeName()。此举可避免重复 —— 调用方写作 apiclient.New(),而非 apiclient.NewClient()。仅当包中存在多个可构造类型时(如 http.NewRequest、http.NewServeMux),才使用 NewTypeName()。
布尔结构体字段: 未导出的布尔字段 必须 使用 is/has/can 前缀 —— 如 isConnected、hasPermission,而非裸露的 connected 或 permission。导出的 getter 方法保留该前缀:IsConnected() bool。这使字段读起来像一个问题,并能自然区分布尔类型与其他类型。
错误字符串全小写(含缩略词): 应写作 "invalid message id",而非 "invalid message ID",因为错误字符串常与其他上下文拼接(如 fmt.Errorf("parsing token: %w", err)),句中混用大小写显得不协调。哨兵错误(sentinel error)应以包名为前缀:errors.New("apiclient: not found")。
枚举零值: 总是在 iota 索引 0 处显式定义 Unknown/Invalid 哨兵值。声明 var s Status 会静默初始化为 0;若该值映射到真实状态(如 StatusReady),则代码可能误以为状态已被主动选择,而实际只是未初始化。
子测试名称: t.Run() 中表格驱动测试用例的名称应为全小写的描述性短语:"valid id"、"empty input" —— 而非 "valid ID" 或 "Valid Input"。
完整规则、示例及设计原理,请参阅:
包、文件与导入别名(Packages, Files & Import Aliasing) —— 包命名(单字、小写、无复数)、文件命名规范、导入别名模式(仅在冲突时使用以降低认知负荷)、目录结构。
变量、布尔值、接收者与缩略词(Variables, Booleans, Receivers & Acronyms) —— 基于作用域的命名(长度匹配作用域:3 行循环用 i,包级变量用更长名称)、单字母接收者惯例(s 表示 Server)、缩略词大小写(URL 非 Url,HTTPServer 非 HttpServer)、布尔命名模式(isReady、hasPrefix)。
函数、方法与选项(Functions, Methods & Options) —— Getter/Setter 模式(Go 省略 Get,故 user.Name() 在调用点自然可读)、构造函数规范(New 或 NewTypeName)、具名返回值(仅用于文档说明)、格式化函数后缀(Errorf、Wrapf)、函数式选项(WithPort、WithLogger)。
类型、常量与错误(Types, Constants & Errors) —— 接口命名(Reader、Closer 等带 -er 后缀)、结构体命名(名词,MixedCaps)、常量(MixedCaps,非 ALL_CAPS)、枚举(类型名前缀,如 StatusReady)、哨兵错误(ErrNotFound 变量)、错误类型(PathError 后缀)、错误消息规范(全小写,无标点)。
测试命名(Test Naming) —— 测试函数命名(TestFunctionName)、表格驱动测试字段规范(input、expected)、测试辅助函数命名、子用例命名模式。
| 错误 | 修正方式 |
|---|---|
ALL_CAPS 常量 |
Go 使用大小写表示可见性,而非强调 —— 应使用 MixedCaps(如 MaxRetries) |
GetName() Getter |
Go 省略 Get,因 user.Name() 在调用点自然可读。但布尔谓词仍保留 Is/Has/Can 前缀:IsHealthy() bool,而非 Healthy() bool |
Url、Http、Json 缩略词 |
混合大小写的缩略词易引发歧义(如 HttpsUrl —— 是 Https+Url?)。应统一用全大写或全小写 |
this 或 self 接收者 |
Go 方法调用频繁 —— 使用 1–2 字母缩写(如 s 表示 Server)以减少视觉干扰 |
util、helper 包 |
此类名称无法传达内容 —— 应使用具体名称,准确描述所封装的抽象 |
http.HTTPClient 重复 |
调用点始终包含包名 —— http.Client 可避免重复阅读 “HTTP” |
user.NewUser() 构造函数 |
单一主要类型应使用 New() —— user.New() 避免重复类型名 |
connected bool 字段 |
裸露形容词含义模糊 —— 使用 isConnected 使字段读作是非问句 |
"invalid message ID" 错误 |
错误字符串必须全小写(含缩略词) —— 应为 "invalid message id" |
StatusReady 位于 iota 0 |
零值应为哨兵值 —— StatusUnknown 设为 0 可捕获未初始化情况 |
"not found" 错误字符串 |
哨兵错误应包含包名 —— "mypackage: not found" 明确标识错误来源 |
userSlice 类型中嵌入实现 |
类型应表达其承载内容,而非实现细节 —— users 描述其所含内容,而非其实现方式 |
| 接收者名称不一致 | 同一类型的多个方法间切换接收者名称会误导读者 —— 应保持名称统一 |
snake_case 标识符 |
下划线违反 Go 的 MixedCaps 规范及工具链预期 —— 应使用 mixedCaps |
| 短作用域使用长名称 | 名称长度应匹配作用域 —— 3 行循环中 i 即可,userIndex 反成噪音 |
| 按值命名常量 | 值会变化,职责不会 —— DefaultPort 在端口变更后仍有效,Port8080 则失效 |
FetchCtx() 上下文变体 |
WithContext 是 Go 标准后缀 —— FetchWithContext() 可被立即识别 |
sort() 原地操作但无 In |
读者默认函数返回新值。SortIn() 明确表明该函数执行原地修改 |
parse() 出错时 panic |
MustParse() 明确警告调用方失败将触发 panic —— 意外行为应在名称中体现 |
混用 With*、Set*、Use* |
代码库内应保持一致 —— With* 是 Go 中函数式选项的标准约定 |
| 复数包名 | Go 规范要求单数形式(如 net/url 非 net/urls)—— 保证导入路径一致性 |
Wrapf 缺失 f 后缀 |
f 后缀表明支持格式化字符串语义 —— Wrapf、Errorf 提醒调用方传入格式化参数 |
| 不必要的导入别名 | 别名增加认知负担。仅在冲突时使用别名 —— 如 mrand "math/rand" |
| 概念名称不一致 | 对同一概念混用 user/account/person,迫使读者追踪同义词 —— 应统一选用一个名称 |
许多命名规范问题可由 Linter 自动检测,例如:revive、predeclared、misspell、errname。配置与使用方法详见 samber/cc-skills-golang@golang-linter 技能。
samber/cc-skills-golang@golang-code-style 技能,了解更广泛的格式与风格决策samber/cc-skills-golang@golang-structs-interfaces 技能,深入理解接口命名与接收者设计samber/cc-skills-golang@golang-linter 技能,了解自动化强制执行方案(revive、predeclared、misspell、errname)相关专题
热门下载
相关下载
精品课程
共0课时 | 0人学习
共0课时 | 0人学习
共0课时 | 0人学习