Go 语言如何进行代码检查和优化

Linting

Linting 是识别和报告代码中发现的模式的过程,目的是在开发周期的早期提高一致性并捕获错误。 这在团队合作时特别有用,因为它有助于使所有代码看起来都一样,无论是谁编写的,从而降低复杂性并使代码更易于维护。

golangci-lint

golangci-lint is a Go linters aggregator. 集合了各种检查工具

如何安装

# 安装
go get github.com/golangci/golangci-lint/cmd/golangci-lint@v1.32.2
 # 简单执行
golangci-lint run
# 查看帮助,这里会列出lint的用处 
golangci-lint help linters

按照配置执行 golangci-lint

golangci-lint 的配置比较多,你自己可以灵活配置。关于 golangci-lint 的更多配置可以参考官方文档,这里我给出一个常用的配置,代码如下:

.golangci.yml

linters-settings:
  golint:
    min-confidence: 0
  misspell:
    locale: US
linters:
  disable-all: true
  enable:
    - typecheck
    - goimports
    - misspell
    - govet
    - golint
    - ineffassign
    - gosimple
    - deadcode
    - structcheck
    - unused
    - errcheck
service:
  golangci-lint-version: 1.32.2 # use the fixed version to not introduce new linters unexpectedly
 
issues:
  new-from-rev: 1256fca #某个commit之后才开始
  exclude-rules:
    - path: _test\.go # 对test go文件排除一些规则
      linters:
        - gocyclo
        - gosec
        - dupl
 
    # 在项目范围内排除一些 gosec 消息
    - linters:
        - gosec
      text: "weak cryptographic primitive"

修改默认启用的 linter,就需要对 golangci-lint 进行配置。即在项目根目录下新建一个名字为 .golangci.yml 的文件,这就是 golangci-lint 的配置文件。在运行代码规范检查的时候,golangci-lint 会自动使用它。

忽略Linit

  • 使用 //nolint, nolint 可以对一行或者函数或者整个文件使用
//nolint:govet,errcheck // 对文件级别生效
package main
 
import (
    "fmt"
    "math/rand"
    "time"
)
 
func main() {
    rand.Seed(time.Now().UnixNano())
    fmt.Println(rand.Int()) //nolint:gosec // 对行级别生效
}
 
//nolint // 对函数级别生效
func nolintFunc() {
 
}

参考

  • https://golangci-lint.run/
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐