Инструменты, которые помогут улучшить ваш код
Перевод статьи “Simple tools to improve your go code”
Для Go есть целая куча различных статических анализаторов. С их помощью можно писать более простой и надежный код. Некоторые редакторы уже интегрированы с этими инструментами. При желании вы всегда сможете запустить эти инструменты автономно на ваших исходниках.
В этой статье я описал, как мне кажется, самые полезные инструменты. Если у вас появятся идеи сто еще стоит добавить в этот список, то пишите в коментариях.
gosimple
Уже по названию можно догадаться чем занимается эта тулза. С ее помощью можно сделать код проще. Например есть вот такой код:
1// validateContent returns whether or not this text/category
2// is applicable.
3func (s *Struct) validateContent() bool {
4 if strings.Count(w.text, " ") > 4 {
5 return false
6 }
7 return true
8}
Предположим, что это код в одном из моих проектов. Я могу запустить gosimple
в моем проекте с помощью команды gosimple ./...
. Все утилиты из этой статьи запускаются по похожему принципу.
gosimple
укажет вам, что неплохо было бы избаиться от лишней проверки и возвращать значение напрямую.
should use 'return <expr>' instead of 'if <expr> { return <bool> }; return <bool>'
Это только небольшой пример. Тулза проверяет целую кучу правил, которые можно нати тут.
golint
golint
проверяет стилистические.
Например, тулза сообщит вам если публичный метод будет без комментария. А если комментарий будет, то golint
проверит код на “бест практисес”. Если вы напишите метод newJsonData()
то будет предложено назвать его newJSONData()
. И так далее.
Саму утилиту можно найти тут
go vet/staticcheck
Идет вместе с Go и можно использовать командой go vet
.
Эта тулза применяет статические проверки к вашему коду. Она использует большой набор правил и может проверить, например, подозрительные Printf
, забытые параметры при форматировании строк fmt.Sprintf("%s%d", var1)
и так далее.
Советую также использовать staticcheck
. Это похожая утилита, только набор правил уже другой.
unused/unparam
Когда вы используете go fmt
, линтер и ваш мозг кажется все под контролем и этого достаточно. Но находить неиспользуемые куски кода будет все еще сложно.
unused поможет найти не используемые функции, методы, константы и так далее. Лишний код всегда смущает, когда пытаешься разобраться как тут все устроено. Такой код всегда лучше удалить.
unparam как мне кажется, даже еще более полезная. Эта утилита показывает есть ли в функции неиспользуемые параметры. А неиспользуемые параметры значат что функцию стоит немного переписать(возможно переименовать).
errcheck
errcheck
эта утилита следит за ошибками, которые возвращаются из функций, и сообщает когда эти ошибки не проверяются. Компилятор вам ничего не скажет если вы будете “глушить” ошибки. Поэтому вам нужен кто-то кто будет напоминать о всех таких местах. Найти его можно тут.
gometalinter
Этот инструмент который объединяет все существующие. Он параллельно запускает все утилиты и нормализирует их вывод. gometalinter
избавляет вас от необходимости запускать кучу утилит друг за другом. Правда есть проблема: он выдает слишком много информации.
Кстати, репозиторий этого проекта отличное место для получения информации по всевожможным статическим чекерам.
Заключение
Некоторые утилиты стоит запускать каждый раз при сохранении файла, как это бывает с go fmt
. Многий редакторы сейчас неплохо интегрируются с gometalinter
например vim-go или Visual Studio Code. Для себя я решил сначала использовать их в ручном режиме. Так я смогу постепенно улучшать свои скилы.
Если вы терпеливы, то можете интегрировать описанные инструменты с CI и запукать их автоматически перед сборкой.
Через время вы сами определитесь как вам удобный пользоваться этими инструментами.
Ссылки
Если вы хотите больше узнать про эти и другие инструменты, то вам стоит начать с репозитория gometalinter и go-tools.