引入Golangci棉绒
#spanish #go #linter #golangcilint

但是,尽管GOFMT允许我们使用对外部工具的标准愿望格式化代码,以便能够为我们的代码建立其他规则。检查诸如以下检查功能,使用我们或不必要的种姓的元素是需要更可定制的工具的元素。

golangci-lint进入的地方。 Golangci-lint本身就是一系列不同边界的执行者。也就是说,它本身不是一个灯笼,而是使用GO社区写的不同垃圾箱来在单个软件包中提供这些工具的使用。

它具有MacOS,Linux和Windows的不同安装选项;作为CI/CD工具中的安装​​脚本作为在我们的管道中使用它们。此外,这还具有一个asdf插件,可以使用此工具配置不同的版本。

使用已安装的工具,我们可以用:
确认它

$ golangci-lint version
golangci-lint has version 1.49.0 built from cc2d97f3 on 2022-08-24T10:24:37Z

配置

可以使用YML,TAML,TOML或JSON类型文档编写的文件配置此工具。这使我们能够通过ASã项目具有个性化的配置。我们只需要将这些文件放在我们项目的拉s中,或在执行过程中定义路径;否则,Galangci-lint将在用户目录中寻求全局配置文件。如果找不到配置文件,则使用默认配置。

我们可以配置诸如超时,并发执行,测试,文件或目录的测试审查等内容,以忽略(非常忽略诸如供应商或文件产生的文件),输出格式等内容。此外,可以在此文件中配置有关该工具配置的这些选项,以执行要分析我们的代码的衬套集。如果我们要添加或删除衬套到默认配置和执行中,这非常重要。

例子

对于此示例,我们将使用以下配置文件:

linters:
  enable:
    - errcheck
    - funlen
    - gofmt
    - gosimple
    - ifshort
    - predeclared

linters-settings:
  funlen:
    lines: 20
    statements: 20
  gofmt:
    simplify: true

run:
  skip-dirs:
    - .git
    - vendor

我们将分析以下程序:

package main

import (
    "fmt"
    "strconv"
)

func Foo() {
    fmt.Println("foo")
    fmt.Println("foo")
    fmt.Println("foo")
}

func Bar() {
    fmt.Println("foo")
    fmt.Println("foo")
    fmt.Println("foo")
}

func Example() (string, error) {

    n := 1

    n = 100

    n = 10

    if n < 100 {

        res, _ := strconv.ParseComplex("", 1)

        // Lorem.
        // Lorem.
        // Lorem.
        // Lorem.
        // Lorem.
        // Lorem.
        // Lorem.
        // Lorem.
        // Lorem.
        // Lorem.
        // Lorem.
        // Lorem.
        // Lorem.
        // Lorem.
        // Lorem.

        fmt.Println(res)

    }

    return "Example", nil
}

func main() {
    Foo()
    Bar()
    Example()
}

在此示例中,我们有三个具有不同问题的测试功能。代码编译,如果我们使用GOFMT验证,则按照Galang样式指南正确编写。但是,使用Golangci-lint,我们可以验证一些我们可能想照顾我们的变化的事情。

$ golangci-lint run
main.go:58:9: Error return value is not checked (errcheck)
        Example()
               ^
main.go:20: Function 'Example' is too long (32 > 20) (funlen)
func Example() (string, error) {
main.go:22:2: ineffectual assignment to n (ineffassign)
        n := 1
        ^
main.go:24:2: ineffectual assignment to n (ineffassign)
        n = 100
        ^
main.go:30:38: SA1030: 'bitSize' argument is invalid, must be either 64 or 128 (staticcheck)
                res, _ := strconv.ParseComplex("", 1)

执行为我们提供了有关发现的错误的不同信息,例如:文件的名称和女士,对LANTER的错误和名称的描述。 Kouude la Zama给我们一个有趣的错误:Kude1是我们功能中代码总数与配置文件中允许的数字的比较。如果我们更改配置,我们可以看到此消息如何从错误列表中消失。

linters-settings:
  funlen:
    lines: 100
    statements: 100
$ golangci-lint run
main.go:58:9: Error return value is not checked (errcheck)
        Example()
               ^
main.go:22:2: ineffectual assignment to n (ineffassign)
        n := 1
        ^
main.go:24:2: ineffectual assignment to n (ineffassign)
        n = 100
        ^
main.go:30:38: SA1030: 'bitSize' argument is invalid, must be either 64 or 128 (staticcheck)
                res, _ := strconv.ParseComplex("", 1)

,但理想是更改我们的代码以适应我们的规则,而不是复兴。因此,您将将配置返回到原始的20行。

linters-settings:
  funlen:
    lines: 20
    statements: 20

必须修改源代码才能遵守已建立的设置。更改后,我们可以看到新文件:

package main

import (
    "fmt"
    "log"
    "strconv"
)

func Foo() {
    fmt.Println("foo")
    fmt.Println("foo")
    fmt.Println("foo")
}

func Bar() {
    fmt.Println("foo")
    fmt.Println("foo")
    fmt.Println("foo")
}

func Example() (string, error) {
    if n := 10; n < 100 {
        res, _ := strconv.ParseComplex("", 64)
        fmt.Println(res)
    }

    return "Example", nil
}

func main() {
    Foo()
    Bar()

    if _, err := Example(); err != nil {
        log.Fatal(err)
    }
}

$ golangci-lint run
$ 

更多自动化

有些垃圾箱比其他垃圾箱更简单。在执行工具期间,可以使用Flag --fix轻松修复GOFMT中的文件,例如GOFMT中的文件。如果您第一次在广泛的代码库中执行灯笼,则主要是â骨,允许在第一次执行期间修复所有这些错误,而无需通过自己修改文件来手动进行操作。

>

结论

建立了我们的代码标准非常重要,尤其是当我们与更多人合作时。这样,组织也可以按照官方社区的规范和指南来维护相同的编码方式,并自定义自己的编码方式。有关Golangci-lint的更多信息,他们可以咨询其sitio oficial.