Инструменты, которые помогут улучшить ваш код

13 minute read

Перевод статьи “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.

comments powered by Disqus