Gogolintgofmtmisspellgolangci-lint

官网地址: https://github.com/golangci/golangci-lint

golangci-lint

1. 安装

golangci-lintgolangci-lintGo
go get github.com/golangci/golangci-lint/cmd/golangci-lint@v1.35.2
golangci-lint

如不能成功安装,则使用下面命令:

# binary will be $(go env GOPATH)/bin/golangci-lint
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.35.2

不能成功安装请参考
https://blog.csdn.net/txl910514/article/details/105880125

wohu@ubuntu:~$ curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.35.2
golangci/golangci-lint info checking GitHub for tag 'v1.35.2'
golangci/golangci-lint info found version: 1.35.2 for v1.35.2/linux/amd64
golangci/golangci-lint info installed /home/wohu/gocode/bin/golangci-lint
wohuh@ubuntu:~$ ls go

如果还是安装失败,采用以下方法,下载源码,执行安装脚本

cd $GOPATH/src/github.com
git clone https://github.com/golangci/golangci-lint.git
cd golangci-lint/
chmod +x install.sh
sh install.sh -b $(go env GOPATH)/bin v1.38.0

安装完成后,在终端输入如下命令,检测是否安装成功。

golangci-lint --version
golangci-lint has version 1.35.2 built from 1da5701 on 2021-01-11T02:54:03Z

2. 运行

golangci-lint
package mainimport "os"const name string = "wohu"
func main() {os.Mkdir("demo_test", 0755)
}

运行命令:

wohu@ubuntu:~/gocode/src$ golangci-lint run demo.go 
demo.go:5:7: `name` is unused (deadcode)
const name string = "wohu"^
demo.go:7:13: Error return value of `os.Mkdir` is not checked (errcheck)os.Mkdir("demo_test", 0755)^

通过代码检测结果可以看到,两个代码规范问题都被检测出来了。检测出问题后,你就可以修复它们,让代码更加符合规范。

3. 配置

golangci-lintlintergolangci-lintlinter
  • deadcode - 死代码检查
  • errcheck - 返回错误是否使用检查
  • gosimple - 检查代码是否可以简化
  • govet - 代码可疑检查,比如格式化字符串和类型不一致
  • ineffassign - 检查是否有未使用的代码
  • staticcheck - 静态分析检查
  • structcheck - 查找未使用的结构体字段
  • typecheck - 类型检查
  • unused - 未使用代码检查
  • varcheck - 未使用的全局变量和常量检查
golangci-lintlintergolangci-lint linterslinter
lintergolangci-lint.golangci.ymlgolangci-lintgolangci-lintunused
.golangci.yml
linters:disable-all: trueenable:- unused
golangci-lintgolangci-lint
service:golangci-lint-version: 1.32.2 # use the fixed version to not introduce new linters unexpectedly
linterUS
linters-settings:misspell:locale: US
golangci-lintgolangci-lint
.golangci.yml
linters-settings:golint:min-confidence: 0misspell:locale: US
linters:disable-all: trueenable:- 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

4. 集成到 CI

CICI
JenkinsGitlab CIGithub ActionMakefilegolangci-lintMakefile
getdeps:@mkdir -p ${GOPATH}/bin@which golangci-lint 1>/dev/null || (echo "Installing golangci-lint" && go get github.com/golangci/golangci-lint/cmd/golangci-lint@v1.32.2)
lint:@echo "Running $@ check"@GO111MODULE=on ${GOPATH}/bin/golangci-lint cache clean@GO111MODULE=on ${GOPATH}/bin/golangci-lint run --timeout=5m --config ./.golangci.yml
verifiers: getdeps lint