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/