Uber Go 编码规范精讲:函数命名(Function Names)的 MixedCaps 约定与测试函数下划线分组
发布时间:2026/9/26 18:58:59来源:尧图网络
文档【免费下载链接】uber_go_guide_cnUber Go 语言编码规范中文版. The Uber Go Style Guide .项目地址https://gitcode.com/gh_mirrors/ub/uber_go_guide_cn点击查看免费下载本文是《Uber Go 语言编码规范》uber_go_guide_cn 仓库对应规范条目见 src/function-name.md中函数命名一节的深度解读。核心主题Go 函数名一律遵循 MixedCaps混合大小写约定、测试函数是唯一允许使用下划线的例外配套讲解 Printf 风格函数、错误值、包名等相关命名规则并给出与表驱动测试、go vet 工具链结合的实战建议。读完本文你将掌握一套可落地、可被go vet与代码评审自动校验的 Go 函数命名体系。一、核心规则函数名使用 MixedCaps规范原文的第一条原则非常简短但分量极重We follow the Go communitys convention of using MixedCaps for function names.即函数命名遵循 Go 社区通行约定——MixedCaps混合大小写。这条约定源自 Go 官方的 Effective Go 文档是整个 Go 标识符命名体系变量、常量、类型、函数、方法的共同基石。1.1 什么是 MixedCapsMixedCaps 是指不使用下划线_连接单词多单词名称采用驼峰式拼接首字母大写导出或小写非导出后续每个单词首字母大写。场景推荐命名MixedCaps不推荐下划线/全小写导出函数ParseConfig,NewServerparse_config,newserver非导出函数parseConfig,newServerparse_config,parseconfig接收器方法(s *Server) StartTLS()(s *Server) start_tls()MixedCaps这个名字本身就混合了大写和小写生动地说明了该约定的字面含义MixedCaps而不是mixed_caps。1.2 为什么 Go 社区约定用 MixedCaps从语言设计角度看Go 的导出可见性规则与命名约定深度绑定首字母大写的标识符如ParseConfig会被导出对包外可见首字母小写的标识符如parseConfig仅在包内可见。如果允许下划线可见性判断会被下划线前缀/后缀干扰可读性与工具链分析都会变复杂。统一使用 MixedCaps可以让大小写成为判断导出状态的唯一信号这也是golint、go vet及各类 IDE 静态检查默认遵循的规则。二、唯一例外测试函数允许下划线规范的完整原文为An exception is made for test functions, which may contain underscores for the purpose of grouping related test cases, e.g.,TestMyFunction_WhatIsBeingTested.测试函数是唯一的例外允许且鼓励在函数名中使用下划线目的是对相关的测试用例进行分组。规范给出的标准范式是func TestMyFunction_WhatIsBeingTested(t *testing.T)即采用Test被测函数名_被测试的具体行为的格式下划线把被测对象与测试场景清晰分隔。2.1 分组命名的实战价值为什么需要下划线分组当一个函数有多个行为分支时用多个独立的测试函数可以精确表达测的是什么func TestParseConfig_ReturnsErrorOnMissingFile(t *testing.T) { ... } func TestParseConfig_ReturnsErrorOnInvalidSyntax(t *testing.T) { ... } func TestParseConfig_SetsDefaultsWhenFieldsOmit(t *testing.T) { ... }这种命名带来的直接收益失败信息可定位测试失败时测试名本身就是一份行为规格说明书无需翻代码即可判断是哪个分支出了问题测试报告可读go test -v输出的测试名即文档与子测试subtests配合配合表驱动测试中的t.Run(name, ...)可以形成函数名场景分组→ 子测试名具体输入/输出的层级结构。2.2 与表驱动测试Test Tables组合使用Uber 规范中另一条目 表驱动测试 与上述命名约定天然互补。表驱动测试要求用切片tests与循环变量tt组织用例并用give/want前缀标明输入输出func TestSplitHostPort(t *testing.T) { tests : []struct { give string wantHost string wantPort string }{ {give: 192.0.2.0:8000, wantHost: 192.0.2.0, wantPort: 8000}, {give: 192.0.2.0:http, wantHost: 192.0.2.0, wantPort: http}, {give: :8000, wantHost: , wantPort: 8000}, {give: 1:8, wantHost: 1, wantPort: 8}, } for _, tt : range tests { t.Run(tt.give, func(t *testing.T) { host, port, err : net.SplitHostPort(tt.give) require.NoError(t, err) assert.Equal(t, tt.wantHost, host) assert.Equal(t, tt.wantPort, port) }) } }此时外层函数名TestSplitHostPort保持 MixedCaps不含下划线而每个t.Run(tt.give, ...)的子测试名直接使用输入值。当被测函数有多种行为模式成功/失败、默认值/显式值时再使用TestXxx_WhatIsBeingTested的下划线分组格式拆成多个测试函数避免在单个表格里塞入大量shouldErr、shouldCallX之类的条件分支——这一点在 表驱动测试 的避免表格测试中不必要的复杂性一节有专门论述。2.3 并行测试t.Parallel时的命名注意事项在并行子测试中下划线分组命名尤其重要当测试失败时你需要在并行输出中快速识别是哪一组用例失败。参见 表驱动测试 中关于t.Parallel()的示例for _, tt : range tests { tt : tt // for t.Parallel t.Run(tt.give, func(t *testing.T) { t.Parallel() // ... }) }务必在循环体内显式声明迭代变量tt : tt否则并行运行的大多数测试会拿到错误的tt值——这会让命名良好的测试也张冠李戴排查成本陡增。三、与函数命名配套的相邻规则仓库佐证《Uber Go 编码规范》将函数名安排在 Style / 规范 章节与一系列命名规则互为表里。下面是本仓库中与函数命名直接相关的几条建议一并阅读3.1 命名 Printf 风格函数让 go vet 能识别命名 Printf 样式的函数 规定声明Printf风格函数时应确保go vet能识别并检查其格式化字符串。优先使用预定义名称Printf、Sprintf、Errorf等go vet默认检查这些名称自定义名称必须以f结尾例如Wrapf而不是Wrap可用go vet -printfuncswrapf,statusf让go vet额外检查指定的自定义函数。这条规则与 MixedCaps 共同构成函数命名的一部分f后缀是格式化函数的命名约定与驼峰拼写一致Wrapf而非wrap_f。3.2 错误命名Err 前缀与 Error 后缀错误命名 针对全局错误变量给出了独立于下划线规则的约定var ( ErrBrokenLink errors.New(link is broken) // 导出错误Err 前缀 ErrCouldNotOpen errors.New(could not open) errNotFound errors.New(not found) // 非导出错误err 前缀 ) type NotFoundError struct { ... } // 自定义错误类型Error 后缀注意该文档明确说明This guidance supersedes the Prefix Unexported Globals with _即错误变量的命名优先于_ 前缀全局变量 规则。函数与错误值的命名虽然对象不同但共享同一原则——用前缀/后缀传递语义信息Err可匹配的错误值、Error错误类型、f格式化函数。3.3 包命名与函数名的一致性包名 要求包名全部小写、无大写与下划线、简短、不用复数。包名是函数名的命名空间前缀调用url.Parse时包名url与函数名ParseMixedCaps拼接出完整可读的调用表达式。包名不用下划线正是为了保证包名 MixedCaps 函数名整体可读。3.4 函数分组与顺序函数分组与顺序 规定文件内函数按接收器分组、按调用顺序大致排序newXYZ()/NewXYZ()放在类型定义之后、其余方法之前工具函数放在文件末尾。命名与排版双管齐下才能让一个文件扫一眼名字就知道结构。四、工具链落地方案规范 Linting 章节要求所有代码通过golint与go vet检查并建议编辑器在保存时运行goimports。针对函数命名可以这样落地保存时运行goimports自动处理导入与基础排版保证命名相关的行宽、缩进一致运行go vet自动识别 Printf 风格函数并检查格式串配合-printfuncs覆盖自定义函数运行golint对导出函数名的大小写、注释规范给出提示代码评审清单可直接用于 Review函数名是否为 MixedCaps无下划线非测试函数是否出现_如my_func若有改为myFunc测试函数是否遵循TestXxx_WhatIsBeingTested分组范式Printf 风格自定义函数是否以f结尾五、总结函数命名在 Go 中的规则可以用一句话概括MixedCaps 是默认下划线只属于测试。Uber 规范在 src/function-name.md 中给出的全部要点为函数名遵循 Go 社区 MixedCaps 约定无下划线驼峰式唯一例外是测试函数允许用下划线分组相关测试用例范式为TestMyFunction_WhatIsBeingTested配合 命名 Printf 样式的函数f后缀、错误命名Err/err前缀、Error后缀、包名全小写无下划线等相邻规则形成完整的命名体系通过go vet、golint与代码评审清单即可低成本落地。命名是代码的第一份文档。当测试函数名能直接读出被测对象 行为场景当go vet能自动校验格式化函数——整个代码库的可维护性就会产生质的提升。赞分享文档【免费下载链接】uber_go_guide_cnUber Go 语言编码规范中文版. The Uber Go Style Guide .项目地址https://gitcode.com/gh_mirrors/ub/uber_go_guide_cn点击查看免费下载相关推荐Uber Go Style Guide函数命名规范MixedCaps 与测试函数命名深度解析Uber Go Style Guide函数命名规范MixedCaps 与测试函数命名深度解析 本篇技术指南聚焦于 Uber Go Style Guide文档教程代码质量Lint抖音批量下载指南douyin-downloader 无水印视频采集完整教程抖音批量下载指南douyin downloader 无水印视频采集完整教程 需要做抖音批量下载却被水印、限速和重复劳动拖住douyin downloade文档如何用Special K修复游戏画面新手必备的图形增强完全指南如何用Special K修复游戏画面新手必备的图形增强完全指南 Special K是PC游戏玩家的瑞士军刀提供强大的图形增强和画面修复功能。本文将带你快速掌图形学3D渲染性能剖析上一篇Prime Agent与GitHub Copilot对比哪个AI编码助手更适合你下一篇Atlas数据迁移工具终极对比为什么选择Atlas而非Flyway/Liquibase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网