Go 开发模式
用于构建健壮、高效和可维护应用程序的惯用 Go 模式与最佳实践。
何时激活
- 编写新的 Go 代码时
- 审查 Go 代码时
- 重构现有 Go 代码时
- 设计 Go 包/模块时
核心原则
1. 简洁与清晰
Go 推崇简洁而非精巧。代码应该显而易见且易于阅读。
// Good: Clear and direct
func GetUser(id string) (*User, error) {
user, err := db.FindUser(id)
if err != nil {
return nil, fmt.Errorf("get user %s: %w", id, err)
}
return user, nil
}
// Bad: Overly clever
func GetUser(id string) (*User, error) {
return func() (*User, error) {
if u, e := db.FindUser(id); e == nil {
return u, nil
} else {
return nil, e
}
}()
}
2. 让零值变得有用
设计类型时,应使其零值无需初始化即可立即使用。
// Good: Zero value is useful
type Counter struct {
mu sync.Mutex
count int // zero value is 0, ready to use
}
func (c *Counter) Inc() {
c.mu.Lock()
c.count++
c.mu.Unlock()
}
// Good: bytes.Buffer works with zero value
var buf bytes.Buffer
buf.WriteString("hello")
// Bad: Requires initialization
type BadCounter struct {
counts map[string]int // nil map will panic
}
3. 接受接口,返回结构体
函数应该接受接口参数并返回具体类型。
// Good: Accepts interface, returns concrete type
func ProcessData(r io.Reader) (*Result, e…