6.2 代码规范
Effective Go 要点
go
// 命名规范
package handler // 包名:简短、小写
var userID int // 变量:驼峰命名
const MaxRetry = 3 // 常量:驼峰或全大写
// 注释规范
// Package handler 提供 HTTP 处理器
package handler
// GetUser 根据 ID 获取用户
func GetUser(id int) (*User, error) {
// ...
}
// 错误处理
if err != nil {
return err
}
// 错误消息小写开头,不带句号
return errors.New("invalid input")
// 接口设计
// 小接口,单一职责
type Reader interface {
Read(p []byte) (n int, err error)
}
// 接受接口,返回结构体
func Process(r io.Reader) (*Result, error) {
// ...
}golangci-lint
bash
# 安装
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
# 运行
golangci-lint run
golangci-lint run ./...
golangci-lint run --fast
# 配置文件 .golangci.yml
linters:
enable:
- gofmt
- govet
- gosimple
- staticcheck
- unused
- errcheck
- gocritic
- misspell
linters-settings:
gofmt:
simplify: true
issues:
exclude-rules:
- path: _test\.go
linters:
- errcheck代码风格指南
go
// 简化 if 语句
if x { // 而不是 if x == true
return true
}
// 使用 strings.Contains
if strings.Contains(s, substr) { // 而不是 strings.Index >= 0
// ...
}
// 避免不必要的嵌套
func process() error {
if !cond1 {
return nil
}
if !cond2 {
return nil
}
// 主逻辑
return nil
}
// 提前返回 (Guard Clause)
func validate(u *User) error {
if u == nil {
return errors.New("user is nil")
}
if u.Name == "" {
return errors.New("name is required")
}
return nil
}
// 使用 make 预设容量
result := make([]int, 0, n) // 而不是 var result []int
// 避免裸返回
func parse() (string, error) {
return doParse() // 而不是分别赋值后裸返回
}
// 零值可用
type Counter struct {
mu sync.Mutex
value int
}
// 零值 Counter 可直接使用