【问题标题】:golint execution returns nothinggolint 执行不返回任何内容
【发布时间】:2020-04-16 01:55:21
【问题描述】:

我正在为 exercism.io 编写练习代码。我的导师说我的代码应该由一些 go lint 来检查,他建议我尝试 golint 和 golangci-lint。 我通过go get -u golang.org/x/lint/golint 安装了 golint,并启动了它:

rustam:hamming $ golint hamming.go 
rustam:hamming $ 

但它什么也不返回。 此外,如果我使用 golangci-lint 也会得到相同的结果——只是什么都没有。我也不知道为什么。

有我的代码,全是样式错误:

// Package hamming is Exercism.io exercise
package hamming

import "errors"

// Distance — Calculating Hamming Distance for two DNA strands
func Distance(a, b string) (int, error) {

    if len(a) != len(b) {
        return 0, errors.New("Strands should be equal size")
    }

    if len(a) == 0 || len(b) == 0 {
        return 0, nil
    }

    var hd int = 0

    for i := 0; i < len(a); i++ {
        if a[i] != b[i] {
            hd++
        }
    }

    return hd, nil
}

还有我的 go env:

rustam:hamming $ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN="/Users/rustam/go/bin"
GOCACHE="/Users/rustam/Library/Caches/go-build"
GOENV="/Users/rustam/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/rustam/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/Cellar/go/1.13.4/libexec"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/Cellar/go/1.13.4/libexec/pkg/tool/darwin_amd64"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/4j/4rjv22zs1pb68wssv5gn2wfw0000gn/T/go-build148685464=/tmp/go-build -gno-record-gcc-switches -fno-common"

还有我的 ~/.bash_profile

export GOPATH=$HOME/go
export GOBIN=$HOME/go/bin
export PATH=$PATH:$GOPATH/bin

如果您能指出我的错误,我将不胜感激。

【问题讨论】:

  • 当 linter 什么都不返回时,这通常意味着它没有发现任何问题。你有理由认为它应该发现问题吗?
  • 是的。我的导师发送了他的 linter 执行,并且有一些消息,例如 $ golint hamming.go hamming.go:17:15: should drop = 0 from declaration of var hd; it is the zero value
  • 我可以在本地确认golintgolaingci-lint 都没有发现该文件有任何问题,使用默认配置。
  • @Volker:这是一个见仁见智的问题,“最佳实践”(如果存在的话)通常是特定于上下文的,你不能指望 linter 总是正确的。
  • 你在困惑什么?

标签: go golint


【解决方案1】:

在 Go 中,最少的检查可能是 Go 工具 go fmtgo vetgolint

这是一个最小的、可重现的示例(请参阅 How to create a Minimal, Reproducible Example),它表明您的 hamming.go 程序通过了所有当前检查。

Command golint

$ go version
go version devel +075c20cea8 Thu Dec 26 13:53:31 2019 +0000 linux/amd64
$ go fmt hamming.go
$ go vet hamming.go
$ go get -u golang.org/x/lint/golint
go: downloading golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f
go: found golang.org/x/lint/golint in golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f
go: downloading golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f
go: golang.org/x/tools upgrade => v0.0.0-20191226230302-065ed046f11a
go: downloading golang.org/x/tools v0.0.0-20191226230302-065ed046f11a
$ golint hamming.go
$ cat hamming.go
// Package hamming is Exercism.io exercise
package hamming

import "errors"

// Distance — Calculating Hamming Distance for two DNA strands
func Distance(a, b string) (int, error) {

    if len(a) != len(b) {
        return 0, errors.New("Strands should be equal size")
    }

    if len(a) == 0 || len(b) == 0 {
        return 0, nil
    }

    var hd int = 0

    for i := 0; i < len(a); i++ {
        if a[i] != b[i] {
            hd++
        }
    }

    return hd, nil
}
$

评论:我的导师发送了他的 linter 执行,并且有一些消息,例如

$ golint hamming.go hamming.go:17:15: 
should drop = 0 from declaration of var hd; it is the zero value 

– 锈迹

您的导师正在使用旧版本的 golint。对于当前版本,它们应该运行

go get -u golang.org/x/lint/golint

您的导师是否解释了golint 的有限用途?例如,“Golint 并不完美,同时存在误报和误报。不要将其输出视为黄金标准。”

Golint is a linter for Go source code.

目的

Golint 与 gofmt 不同。 Gofmt 重新格式化 Go 源代码,而 golint 打印出样式错误。

Goint 与 govet 不同。 Govet 关注正确性, 而 golint 则关注编码风格。 Golint 在使用 谷歌,它试图匹配开源 Go 的公认风格 项目。

golint 提出的建议正是:建议。戈林特 并不完美,同时存在误报和误报。做 不将其输出视为黄金标准。我们不会添加编译指示 或其他旋钮来抑制特定警告,所以不要期望或 要求代码完全“无绒毛”。总之,这个工具不是, 并且永远不会足够值得信赖,以至于它的建议是 自动执行,例如作为构建过程的一部分。戈林特 对列出的许多机械检查项目提出建议 在 Effective Go 和 CodeReviewComments wiki 页面中。


这是我的解决方案尝试:

package hamming

import "errors"

// Distance returns the Hamming distance for two DNA strings of equal length.
// DNA strings are constructed from the alphabet {A, C, G, T}.
func Distance(a, b string) (int, error) {
    if len(a) != len(b) {
        return 0, errors.New("strings should be of equal length")
    }

    d := 0
    for i := 0; i < len(a); i++ {
        if a[i] != b[i] {
            d++
        }
    }
    return d, nil
}

【讨论】:

  • 谢谢你,@peter!我同意你的看法。我已经通过了我的练习,并告诉我的导师 golint 不是黄金标准,我的工具可能与他的不同。
【解决方案2】:

您应该定义置信水平(min_confidence 参数)。

例如:golint -min_confidence 0 your_file_to_test

查看 golint 用法:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 2019-04-06
    • 2012-02-15
    • 2020-09-07
    相关资源
    最近更新 更多