Go代码规范是强制性基础设施,gofmt -w和go vet为默认依赖,命名、注释、格式均需严格遵循约定以保障编译、协作与工具链正常运转。

Go代码规范不是“可选习惯”,而是编译器和工具链默认依赖的基础设施——不遵守,go fmt会拒绝你,go vet会报错,团队协作第一天就会卡住。
gofmt -w 是强制起点,不是“格式美化”选项
很多人把 gofmt 当作类似 Prettier 的可选格式化工具,这是根本误解。gofmt 输出的代码才是 Go 社区唯一认可的合法语法形态。编辑器里手动调格式、加空行、改缩进,只要没跑 gofmt -w,就等于没完成提交准备。
- 必须用
-w参数写回文件,只看输出(不加-w)无法落地 -
gofmt -s要开启:自动简化冗余括号和空行,避免人工反复调整 - VS Code 中配置
"go.formatTool": "gofmt"+"editor.formatOnSave": true,否则每次保存都在退步 - CI 流程里加
gofmt -l ./ | grep .,有输出就失败——这是硬性门禁,不是提醒
包名和变量名不能“差不多就行”
Go 的可见性、导入路径、IDE 补全、文档生成全部依赖命名规则。一个错位的下划线或大小写,会让 user.Get() 变成编译错误,或者让 db 包被误认为是 DB 类型。
- 包名必须全小写、单字、无下划线:
httpclient✅,http_client❌,HttpClient❌ - 导出标识符(函数/类型/常量)首字母大写:
GetUser✅,getUser❌(外部不可见) - 局部变量用短名:
i,err,data合理;但全局变量/常量要带语义:MaxRetries✅,max❌ - 接口名以
er结尾:Reader,Closer,不是ReadInterface或IReader
go vet 不是“锦上添花”,它能提前拦住运行时 panic
go vet 检查的是语言层面的确定性问题,比如未使用的变量、错误的 printf 动词、结构体字段标签拼写错误。这些问题不会导致编译失败,但大概率引发运行时异常或逻辑错乱。
立即学习“go语言免费学习笔记(深入)”;
- 常见误判场景:
for i := range items { go func() { fmt.Println(i) }() }——go vet会警告循环变量捕获,必须显式传参 - CI 中应执行
go vet ./...,而非仅go vet *.go(后者漏掉子包) - 搭配
staticcheck更进一步:比如检测time.Now().Unix() > 0这类永远为真的表达式 - 不要 suppress:
//nolint:govet只能在极少数明确知晓风险时使用,且需注释说明原因
注释不是写给机器看的,但必须让 go doc 能提取
Go 的文档系统直接从源码注释生成,go doc user.GetUser 能否返回有效说明,取决于注释位置和格式是否严格符合约定。
- 包注释必须紧贴
package xxx上方,且以Package xxx开头(如// Package user provides...) - 导出函数/类型前一行必须是完整句子注释,参数和返回值用
// name: description格式 - 行内注释只能解释“为什么”,不能重复“做什么”:
if err != nil { return err } // 必须立即返回,避免后续逻辑污染✅;// check error❌ - 避免
TODO和FIXME留在生产代码里——它们不会自动触发告警,只会变成技术债盲点
真正难的不是记住每条规则,而是在写第一行 func main() 之前,就让 gofmt -w 和 go vet 成为编辑器里的呼吸节奏。一旦跳过这步,后面所有重构、协作、上线,都在补这个缺口。


















