казнь голинта ничего не возвращает
Я кодирую упражнение для 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