但是,尽管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.