当前位置: 首页 > 工具软件 > GolangCI-Lint > 使用案例 >

Go语言工具包之golint和golangci-lint

劳和歌
2023-12-01

Go语言工具包之golint和golangci-lint

Golang 常用的 checkstyle 有 golangci-lint 和 golint,golangci-lint 用于许多开源项目中。

1、golint

1.1 克隆代码

$ git clone https://github.com/golang/lint.git

1.2 安装

$ cd lint/golint
$ go install

GOBIN 目录下会生成一个可执行文件。

1.3 使用

$ golint -h
Usage of golint:
        golint [flags] # runs on package in current directory
        golint [flags] [packages]
        golint [flags] [directories] # where a '/...' suffix includes all sub-directories
        golint [flags] [files] # all must belong to a single package
Flags:
  -min_confidence float
        minimum confidence of a problem to print it (default 0.8)
  -set_exit_status
        set exit status to 1 if any issues are found

1.4 golint规范

# 不能使用下划线命名法,使用驼峰命名法
don't use ALL_CAPS in Go names; use CamelCase
# 外部可见程序结构体、变量、函数都需要注释
exported function Xxx should have comment or be unexported
# 通用名词要求大写
# iD/Id -> ID
# Http -> HTTP
# Json -> JSON
# Url -> URL
# Ip -> IP
# Sql -> SQL
var statJsonByte should be statJSONByte
var taskId should be taskID
# 包命名统一小写不使用驼峰和下划线
don't use an underscore in package name
don't use MixedCaps in package name; xxXxx should be xxxxx
# 注释第一个单词要求是注释程序主体的名称,注释可选不是必须的
comment on exported type Repo should be of the form "Repo ..." (with optional leading article)
# 外部可见程序实体不建议再加包名前缀
type name will be used as user.UserModel by other packages, and that stutters; consider calling this Model
# if语句包含return时,后续代码不能包含在else里面
if block ends with a return statement, so drop this else and outdent its block
# 建议写成 fmt.Errorf(…)
should replace errors.New(fmt.Sprintf(...)) with fmt.Errorf(...) errors.New(fmt.Sprintf(...))
# receiver名称不能为this或self
receiver name should be a reflection of its identity; don't use generic names such as "this" or "self"
# 错误变量命名需以 Err/err 开头
error var SampleError should have name of the form ErrSample
# a+=1应该改成a++,a-=1应该改成a--
should replace num += 1 with num++
should replace num -= 1 with num--

2、golangci-lint

文档:https://golangci-lint.run/

GitHub地址:https://github.com/golangci/golangci-lint/

2.1 安装

$ go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.42.0

GOBIN 目录下会生成一个可执行文件。

2.2 使用

$ golangci-lint -h
Smart, fast linters runner. Run it in cloud for every GitHub pull request on https://golangci.com

Usage:
  golangci-lint [flags]
  golangci-lint [command]

Available Commands:
  cache       Cache control and information
  completion  generate the autocompletion script for the specified shell
  config      Config
  help        Help
  linters     List current linters configuration
  run         Run the linters
  version     Version

Flags:
      --color string              [32mUse color when printing; can be 'always', 'auto', or 'never'[0m (default "auto")
  -j, --concurrency int           [32mConcurrency (default NumCPU)[0m (default 8)
      --cpu-profile-path string   [32mPath to CPU profile output file[0m
  -h, --help                      help for golangci-lint
      --mem-profile-path string   [32mPath to memory profile output file[0m
      --trace-path string         [32mPath to trace output file[0m
  -v, --verbose                   [32mverbose output[0m
      --version                   [32mPrint version[0m

Use "golangci-lint [command] --help" for more information about a command.

$ golangci-lint run -h

1、检查当前目录下所有的文件

$ golangci-lint run 
# 等同于 
$ golangci-lint run ./...

2、可以指定某个目录和文件

# golangci-lint run [目录]/[文件名]
$ golangci-lint run dir1 dir2/... dir3/file1.go

检查 dir1 和 dir2 目录下的代码及 dir3 目录下的 file1.go 文件

3、可以通过 --enable/-E 开启指定 Linter,也可以通 --disable/-D 关闭指定 Linter

$ golangci-lint run --disable-all -E errcheck

支持的linter参数设置:https://golangci-lint.run/usage/linters/

4、设置总工作超时时间

$ golangci-lint run ./... --timeout=10m

2.3 禁用lint检查

有的时候会需要禁用 lint 检查,可以在需要禁用检测的函数或者语句附近这样使用。

忽略某一行所有 linter 的检查:

var bad_name int //nolint
var bad_name int //nolint:all

忽略某一行指定 linter 的检查,可以指定多个 linter,用逗号隔开:

var bad_name int //nolint:golint,unused

忽略某个代码块的检查:

//nolint:all
func allIssuesInThisFunctionAreExcluded() *string {
  // ...
}

//nolint:govet
var (
  a int
  b int
)

也可以在添加 nolint 的时候添加注释:

//nolint:gocyclo // This legacy function is complex but the team too busy to simplify it
func someLegacyFunction() *string {
  // ...
}

忽略某个文件的指定 linter 检查:

//nolint:unparam
package pkg

在使用 nolint 的过程中,有 3 个地方需要你注意:

首先,如果启用了 nolint,你就需要在 //nolint 后面添加 nolint 的原因 // xxxx。

其次,你使用的应该是 //nolint 而不是 // nolint。因为根据 Go 的规范,需要程序读取的注释 // 后面不应该有空

格。

最后,如果要忽略所有 linter,可以用 //nolint;如果要忽略某个指定的 linter,可以用

//nolint:<linter1>,<linter2>,

 类似资料: