Skip to content

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 可直接使用