安装
这里我使用V1.53.2版本,是比较新的,因为我要使用泛型
go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.53.2
查看是否安装成功
golangci-lint version
缓存
众所周知,在go test
测试中也有缓存,golangci-lint
也有缓存
查看缓存状态
golangci-lint cache status
清除缓存
golangci-lint cache status
指定配置文件
运行时指定
golangci-lint run -config path
使用默认配置,会在运行运行golangci-lint 的目录开始向上查找(.goalngci.yaml | .golangci-lint.json | .golangci.xml)
常用配置项目
skip-dirs 忽略检查目录
.goalngci-lint.yam 如下
run:
skip-dirs:
- internal # 忽略internal目录
skip-files 忽略检查文件
run:
skip-files:
- serv.go # 忽略后半部分为 serv.go 的文件 (如: aserv.go, bserve.go)
- internal/cmd/cmd_serv.go # 指定具体忽略的文件
linters-settings errcheck 配置
linters-settings:
errcheck:
# 从接口类型尝试转回某个具体的struct时,使用第二个参数进行断言
# report about not checking of errors in type assertions: `a := b.(MyStruct)`;
# default is false: such cases aren't reported by default.
check-type-assertions: true
# report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`;
# default is false: such cases aren't reported by default.
check-blank: false
check-type-assertions: true, 从接口类型尝试转回某个具体的struct时,需要使用第二个参数进行断言
check-blank: false, 允许使用 _ 接收error,从而不判断error
使用
基本用法
golangci-lint run 对当前目录下所有文件进行检测
指定文件或目录
golangci-lint run <dirname | filename> 对指定目录或文件进行检查
指定配置
golangci-lint run -c <config-path> 使用指定的配置文件进行检查
指定或关闭检查项
golangci-lint -E <linter> 让linter有效
golangci-lint -D <linter> 让linter无效
在代码中指定跳过检查
跳过一个文件中的检查
在 package 上增加 //nolint
增加前:
package main
import (
"fmt"
"os"
)
func testOne(a string) {
_, err := os.Open("abc.txt")
}
func main() {
fmt.Println("ok")
}
增加后:
// nolint
package main
import (
"fmt"
"os"
)
var b int
func testOne(a string) {
_, err := os.Open("abc.txt")
}
func main() {
fmt.Println("ok")
}
忽略一行的检查
在一行的后面增加 //nolint
增加前:
package main
import (
"fmt"
)
var b int
func main() {
fmt.Println("ok")
}
增加后:
package main
import (
"fmt"
)
var b int // nolint
func main() {
fmt.Println("ok")
}
忽略一个函数的检查
在函数的上面增加 //nolint
增加前:
package main
import (
"errors"
)
func check() error {
return errors.New("err")
}
//nolint
func One() {
check()
}
func main() {
One()
}
增加后:
package main
import (
"errors"
)
func check() error {
return errors.New("err")
}
//nolint
func One() {
check()
}
func main() {
One()
}
跳过指定聚合器
//nolint:聚合器1,聚合器2......
跳过 staticcheck 前:
package main
import (
"errors"
)
func check() error {
return errors.New("err")
}
//nolint:errcheck
func One() {
check()
}
func main() {
One()
}
跳过后:
package main
import (
"errors"
)
func check() error {
return errors.New("err")
}
//nolint:errcheck,staticcheck
func One() {
check()
}
func main() {
One()
}
跳过检查需要给出具体的原因
package main
import (
"errors"
)
func check() error {
return errors.New("err")
}
//nolint:errcheck,staticcheck
//因为xxx原因,所以此处跳过检查
func One() {
check()
}
func main() {
One()
}