Я использую 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.