» Go创建命令行程序grep » 2. 开发 » 2.5 添加 Lint

添加 Lint

Lint 是分析源代码并查找、报告出有关编程风格、潜在错误和编码标准等问题的工具。术语 "lint" 源自一个名为 "lint" 的 Unix 实用工具,它用于识别 C 代码中的错误和缺陷。

在 Go 项目中项目中使用 linting 工具是一种最佳实践,它有助于保证代码质量并保持代码一致性。 有许多适用于 Go 的 linting 工具。其中比较流行的两个工具是 golangci-lintStaticcheck。在此项目中,我们将使用 golangci-lint,毕竟它实际上是一个 Go linters 聚合器。

使用以下命令安装它:

# 二进制文件将位于 $(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.55.2

golangci-lint --version

了解更多关于安装的信息:https://golangci-lint.run/usage/install/

在项目的根目录下创建一个名为 .golangci.yml 的文件。它用作 golangci-lint 的配置文件。

.golangci.yml:

linters:
  enable:
    - deadcode
    - errcheck
    - goimports
    - golint
    - govet
    - ineffassign
    - staticcheck
    - structcheck
    - typecheck
    - unused
    - lll

# 一些 linters 的自定义配置
linters-settings:
  govet:
    check-shadowing: true
  golint:
    min-confidence: 0.8

# 排除一些自动生成的文件或目录
exclude:
  - vendor/
  - generated/

# golangci-lint 的设置
golangci-lint:
  build:
    tags: testing

然后运行它:

golangci-lint run

你将得到一个 lint 问题的列表:

pkg/grep/search.go:68:15: Error return value of `filepath.Walk` is not checked (errcheck)
        filepath.Walk(directoryPath, func(filePath string, info os.FileInfo, err error) error {
                     ^

尝试修复所有问题,然后再次运行 golangci-lint

golangci-lint run

如果没有问题出现,那就意味着你的代码现在是 "风格优良" 的。

pkg/grep/search.go 中的更改:

@@ -65,7 +65,7 @@ func GrepCount(result MatchResult) int {
 
 func GrepRecursive(pattern string, directoryPath string, options *Options) (MatchResult, error) {
        results := make(MatchResult)
-       filepath.Walk(directoryPath, func(filePath string, info os.FileInfo, err error) error {
+       err := filepath.Walk(directoryPath, func(filePath string, info os.FileInfo, err error) error {
                if err != nil {
                        return nil
                }
@@ -79,6 +79,9 @@ func GrepRecursive(pattern string, directoryPath string, options *Options) (Matc
                }
                return nil
        })
+       if err != nil {
+               return nil, err
+       }
        return results, nil
 }