казнь голинта ничего не возвращает

Я кодирую упражнение для excism.io. И мой наставник сказал, что мой код нужно проверять с помощью какого-нибудь го линтера, и посоветовал мне попробовать golint и golangci-lint. Я установил golint черезgo get -u golang.org/x/lint/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

Буду признателен, если вы укажете на мои ошибки.

1 ответ

Решение

В Go минимальными проверками могут быть инструменты Go, go fmt, go vet, а также golint.

Вот минимальный воспроизводимый пример (см. Как создать минимальный воспроизводимый пример), который показывает, что вашhamming.go программа проходит все текущие проверки.

Команда голинта

$ 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
}
$

Комментарий: мой наставник отправил свой линтер, и там были сообщения вроде

$ 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 - это линтер для исходного кода Go.

Цель

Голинт отличается от гофмт. Gofmt переформатирует исходный код Go, тогда как golint распечатывает ошибки стиля.

Голинт отличается от говета. Говет заботится о правильности, а Голинт заботится о стиле кодирования. Golint используется в Google и стремится соответствовать принятому стилю проекта Go с открытым исходным кодом.

Предложения, сделанные голинтом, и есть предложения. Голинт несовершенен и имеет как ложные срабатывания, так и ложные отрицания. Не рассматривайте его продукцию как золотой стандарт. Мы не будем добавлять прагмы или другие регуляторы для подавления конкретных предупреждений, поэтому не ожидайте и не требуйте, чтобы код был полностью "безворсовым". Короче говоря, этот инструмент не заслуживает и никогда не будет достаточно надежным, чтобы его предложения применялись автоматически, например, как часть процесса сборки. Голинт вносит предложения по многим элементам с механической проверкой, перечисленным в Effective Go и на вики-странице CodeReviewComments.


Вот моя попытка решения:

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
}

Вы должны определить уровень достоверности (аргументmin_confidence).

Например: golint -min_confidence 0 your_file_to_test

Смотрите использование голинта:

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
Другие вопросы по тегам