Go 最佳实践
Effective Go 编码规范、错误处理原则、并发安全、零值可用
Go 最佳实践
Go 以简洁著称——好的 Go 代码遵循社区惯例,而不是"炫技"。
学完本章你将: 掌握 Effective Go 规范、错误处理原则、并发安全。
编码规范
go
// ✅ 命名约定
// 包名:小写、单数、简短
package user
// 导出:大写开头
func GetUser() { }
type UserService struct { }
// 非导出:小写开头
func validate() { }
// 变量:驼峰式
var userCount int
var apiClient *http.Client
错误处理惯用法
go
// ✅ 始终检查 error
result, err := doSomething()
if err != nil {
return fmt.Errorf("操作失败: %w", err)
}
// ✅ 错误信息小写开头,不以标点结尾
// ✅ 用 %w 包装错误以保留链路
// ✅ 只在顶层处理 error(打印日志/返回给用户)
并发安全
go
// ✅ 优先用 channel 通信
// ✅ 需要共享状态时用 Mutex
// ✅ 避免 goroutine 泄漏——确保每个 goroutine 有退出路径
// ❌ 不要通过共享内存通信
// ❌ 不要假设 goroutine 的执行顺序
// ❌ 不要在循环中用 defer(defer 在函数结束才执行)
// ✅ 循环中应该这样
for _, f := range files {
func() {
f, _ := os.Open(f)
defer f.Close() // defer 在每次迭代结束时执行
// ...
}()
}
零值可用原则
go
// Go 的设计哲学:零值应该可以直接使用
var buf bytes.Buffer // 空 Buffer,可以直接用
buf.WriteString("hello")
var mu sync.Mutex // 可以直接 Lock(不需要 NewMutex)
mu.Lock()
var wg sync.WaitGroup // 可以直接 Add/Wait
wg.Add(1)