Я использую Go уже некоторое время, и есть три инструмента статического анализа (линтеры), которые я использую ежедневно. Есть десятки других, которые я мог бы использовать, но я не думаю, что разумно слишком сильно зависеть от этих инструментов (большинство из которых неофициальные), чтобы делать вашу работу за вас. В конце концов, они станут кошмаром для отслеживания и обслуживания, и в конечном итоге они могут перестать обслуживаться или не поддерживаться. Посмотрим на пакеты.

Гофмт

Gofmt - официальный инструмент для форматирования кода Go, который входит в состав языка с 2013 года.

Отформатировать файл так просто:

$ go fmt main.go

Или вы можете настроить таргетинг на весь пакет:

$ go fmt ./pkg/models

Чтобы отформатировать все пакеты (кроме vendor) в текущем каталоге:

$ go fmt $(go list ./... | grep -v /vendor/)

ошибка

По словам производителя, errcheck проверяет, что вы проверили ошибки. Другими словами, он просканирует ваш код и сообщит вам, есть ли ошибки. Это может быть полезно в тех случаях, когда вы по глупости забываете запустить приложение после небольшого изменения.

Чтобы проверить ошибки в пакете:

$ errcheck ./pkg/models

Или для сканирования всех пакетов (кроме vendor) в текущем каталоге:

$ errcheck $(go list ./... | grep -v /vendor/)

Ветеринар

Vet - еще один официальный инструмент статического анализа в Go. Vet проверяет исходный код на наличие подозрительных конструкций, таких как вызовы Printf, аргументы которых не совпадают со строкой формата.

По исполнению он очень похож на Gofmt.

Проверка отдельного файла:

$ go vet main.go

Проверка всего пакета:

$ go vet ./pkg/models

Проверка всех пакетов (кроме vendor) в текущем каталоге:

$ go fmt $(go list ./... | grep -v /vendor/)

Автоматизация этих инструментов с помощью хуков Git

Хуки Git - отличный способ автоматизировать эти повторяющиеся задачи и гарантировать, что вы не зафиксируете или не отправите какой-либо неполный код. Все хуки хранятся в подкаталоге .git/hooks вашего проекта Git и будут автоматически выполняться в заранее определенном списке событий Git или после него.

Для этого мы собираемся выполнить привязку к ловушке pre-commit, поскольку мы хотим, чтобы наш скрипт только проверял файлы перед их фиксацией в Git.

Создайте в .git/hooks новый файл с именем pre-commit и откройте его в своем любимом редакторе. Сделайте его исполняемым, запустив chmod +x .git/hooks/pre-commit из терминала.

Во-первых, давайте сохраним список файлов в нашем проекте в переменной с именем FILES:

FILES=$(go list ./...  | grep -v /vendor/)

Добавьте Gofmt рядом с форматом вашего кода:

go fmt ${FILES}

После форматирования самое важное, что нам нужно проверить, - это наличие ошибок. Если есть, мы можем выйти из скрипта и предотвратить фиксацию.

{
    errcheck -ignoretests ${FILES}
} || {
    exitStatus=$?
    if [ $exitStatus ]; then
	printf "\nErrors found in your code, please fix them and try again."
	exit 1
    fi
}

Если код не содержит ошибок, следующее, что мы должны проверить, - это наличие подозрительных конструкций.

{
    go vet ${FILES}
} || {
    exitStatus=$?
    if [ $exitStatus ]; then
	printf "\nIssues found in your code, please fix them and try again."
	exit 1
    fi
}

Вот полный хук pre-commit. Добавьте это в свой проект сегодня и начните коммитить лучший код Go.

Ссылка на исходное сообщение