Z
ZHANK
进阶技巧

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)