gofmt是go官方强制的不可配置格式化工具,仅按硬编码规则重排代码:tab缩进、操作符空格、括号位置等均不可调;常用命令为gofmt -w格式化并覆写文件。

gofmt 是强制起点,不格式化就别写 Go 代码
你写的 Go 代码只要没跑过 gofmt -w,就等于还没开始写。这不是风格偏好,而是协作底线——Google 风格指南第一条就是「用 gofmt 统一格式」,所有缩进、空行、括号位置、导入分组都由它决定。手动调格式等于对抗工具链,还会在 CI 里被 go fmt ./ 自动打回。常见错误是:自己加空格对齐变量声明、把 import 拆成多行手排、给 if 加换行空格。这些全会被 gofmt 覆盖,还可能引发 diff 冲突。建议编辑器直接绑定保存时自动运行 gofmt,或者用 go install golang.org/x/tools/cmd/goimports@latest 替代原生 gofmt,它还能自动增删包引用。
package 名必须小写单字,且与目录名严格一致
package 不是随便起的标签,它直接映射到文件系统路径和导入路径。比如 github.com/foo/bar/baz 下的 baz 目录,其 package 声明只能是 package baz,不能是 package Baz 或 package baz_v2。违反这点会导致:
-
go build报错found packages main and xxx in xxx - 其他包 import 时路径和包名不匹配,符号无法解析
- IDE 无法跳转、补全失效
特别注意 vendor 或内部模块中嵌套目录,如internal/auth/jwt,包名就该是jwt,不是authjwt或auth_jwt。Google 指南明确反对下划线和复数形式,models、utils这类包名也属于反模式,应拆为model、util。
error 必须作为最后一个返回值,且立即检查
Go语言(Golang)1.26.0版本提供 Go 官方 Windows amd64 MSI 安装包下载入口,版本号 1.26.0,可用于旧项目维护、兼容性测试和指定版本开发环境配置。
Go 不抛异常,error 是契约的一部分。函数签名如 func ReadFile(string) ([]byte, error),不是可选约定,是强制接口。容易踩的坑有:
- 把
error放在第一个或中间位置,导致调用方用_, err := f()忽略其他值,语义混乱 - 用
if err != nil之后不 return 或 panic,继续执行后续逻辑(常见于忘记加return) - 用
log.Fatal替代错误传播,切断调用链上下文 - 多层调用中忽略中间 error,只检查最外层,丢失定位信息
正确做法是:每个err != nil分支必须终止当前函数流程(return、panic或封装后return),且上游调用要保留原始 error 或用fmt.Errorf("xxx: %w", err)包裹,否则堆栈和原因全丢。
context.Context 参数永远放在第一位,且绝不塞进 struct
context.Context 是 Go 并发控制和超时传递的统一载体,Google 指南白纸黑字规定:它必须是函数的第一个参数,且不能藏在结构体字段里。反例:type Handler struct { ctx context.Context } + h.DoSomething(),这会让调用方无法传入新 context(比如带 timeout 的),也违背了「context 生命周期由调用方控制」的设计哲学。正确写法是:func (h <em>Handler) DoSomething(ctx context.Context, req </em>Request) error。漏掉这个规则的后果是:
- 单元测试无法注入
context.Background()或context.WithTimeout - 中间件(如日志、鉴权)无法注入 context 值
- HTTP handler 转成 grpc server 时 context 无法透传
- 静态分析工具(如
go vet)会报context should be first parameter
真正难的不是记住这几条,而是每次写新函数时,本能地把 context.Context 插在最前、把 error 拖到最后、让 package 名和目录严丝合缝——这些不是“应该做”,而是“不做就编译/运行/协作不通过”的硬约束。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










