gofmt 是 go 语言强制统一的格式化工具,禁用手动对齐、混用 tab/space 或空行;导出方法省略 get/is/has 前缀;单方法接口用 -er 后缀;包名小写单字;error 必须显式处理,panic 仅用于启动失败或断言;接口要小、定义在调用方、优先复用标准接口。

gofmt 是强制格式化工具,不是可选项
Go 项目里不存在“团队协商缩进风格”这回事。gofmt(或 go fmt)是语言生态的基础设施,所有标准库、主流开源项目、CI 流水线都依赖它统一输出。你写的代码保存时被自动重排,不是编辑器在“帮忙”,而是语言设计者明确拒绝格式争议——省下的时间该花在逻辑和接口设计上。
常见错误现象:gofmt 报错 “warning: malformed file” 或结构体注释没对齐,本质是手动加了空格对齐、混用了 tab 和 space、或在结构体字段间插入了空行。
- vscode 中确保启用了
"editor.formatOnSave": true,且 formatter 设置为gofmt(不是goreturns或其他过时工具) - 不要手动对齐注释;
gofmt会处理//前后的间距和列对齐 - 缩进必须用 tab(
gofmt默认行为),禁用 “insert spaces when pressing tab” 这类设置 - 行长度无硬限制,但超过 120 字符时,优先考虑拆成多行 + 缩进,而不是强行塞进一行
导出标识符命名要直白,不加 Get/Is/Has 前缀
Go 不鼓励 Java 风格的 getter/setter 命名。一个未导出字段 owner,对应导出方法就叫 Owner(),不是 GetOwner();布尔字段 active 对应方法就是 Active(),不是 IsActive()。
使用场景:包内类型暴露状态或配置时,这种命名让调用侧更接近自然语义,比如 cfg.Timeout() 比 cfg.GetTimeout() 更轻量,也更符合 Go 的“少即是多”原则。
- 只有当方法有副作用(如触发重载、缓存刷新)时才考虑加动词前缀,否则一律省略
- 接口命名反其道而行之:单方法接口优先用
Reader、Writer、Closer这类-er形式,这是约定而非规则 - 包名永远小写、单字、无下划线,如
http、sql、json;引用路径是"net/http",包名仍是http
error 处理必须显式,panic 只用于不可恢复错误
Go 没有 try/catch,error 是一等返回值。任何可能失败的操作(文件打开、网络请求、JSON 解析)都必须检查 err != nil,不能忽略、不能只打日志、不能用 _ 吞掉。
容易踩的坑:在 HTTP handler 里对 json.Unmarshal 返回的 err 不做处理,导致前端收到空响应却无报错;或在初始化阶段用 panic 加载缺失配置,却没在 main() 外层 recover,导致进程静默退出。
- 错误检查要靠近调用点,避免把多个
err积累到最后统一判断 -
panic仅限两种情况:程序启动失败(如端口被占、证书无效)、断言失败(assert类逻辑) - 绝不跨包传播
panic;导出函数必须返回error,哪怕只是包装底层 panic - 用
fmt.Errorf("xxx: %w", err)包裹错误,保留原始堆栈;不用+ "xxx"拼接,会丢失链路
接口要小,按需定义,别提前抽象
Go 接口是隐式实现的,定义越小,越容易满足。一个函数参数期待 io.Reader,你传个 *bytes.Buffer、*os.File、甚至自定义的 mockReader 都能直接用——前提是它们都实现了 Read([]byte) (int, error)。
性能影响:小接口编译期就能确定方法集,无运行时反射开销;大接口(如 ReaderWriterCloser)强迫实现者提供一堆无关方法,违背正交性。
- 别写
type DataProcessor interface { Load() error; Save() error; Validate() error },除非这三个方法总是一起被调用 - 优先用已有标准接口(
io.Reader、fmt.Stringer、sort.Interface),而不是另造轮子 - 接口定义放在**调用方**包里,而不是实现方——谁消费,谁定义,避免实现方过度承诺
- 函数参数尽量用接口,返回值尽量用具体类型(如
func NewClient() *HTTPClient),便于 mock 和演进
Logger 接口,在测试中可能只需 Printf,在生产中却要支持 WithField 和异步刷盘——这时候宁可拆两个接口,也不强塞一个“全能 Logger”。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











