логотип PurpleSchool
логотип PurpleSchool

Форматирование кода в Golang

Автор

Александр Гольцман

Единообразное форматирование кода — важная часть разработки, которая влияет на читаемость, поддержку и удобство работы с проектом. В языке Go за стиль кодирования отвечает gofmt — встроенный инструмент, который автоматически форматирует код в соответствии с общепринятыми стандартами. В этой статье я покажу, как gofmt помогает соблюдать единый стиль, расскажу про дополнительные инструменты и объясню, почему ручное форматирование здесь не требуется.

Зачем нужно автоматическое форматирование?

В других языках разработчики часто спорят о стиле кодирования: где ставить пробелы, как оформлять отступы, нужны ли фигурные скобки в однострочных условиях и так далее. В Go этой проблемы нет — форматирование строго определено инструментом gofmt, который приводит код к единому стилю.

Смотрите, автоматическое форматирование решает сразу несколько задач:

  • Обеспечивает единообразие — код от разных разработчиков выглядит одинаково.
  • Экономит время — вам не нужно вручную выравнивать строки и думать о пробелах.
  • Упрощает ревью — если код отформатирован по стандарту, ревьюеры сосредоточены на логике, а не на стиле.
  • Устраняет субъективность — нет необходимости обсуждать правила форматирования в команде.

Использование gofmt

Автоматическое форматирование файла

gofmt входит в стандартную поставку Go, и его использование предельно простое. Чтобы автоматически отформатировать файл, выполните команду:

gofmt -w myfile.go

Флаг -w указывает, что изменения должны быть записаны обратно в файл.

Форматирование всего проекта

Если нужно отформатировать все файлы в текущем каталоге и вложенных папках, используйте:

gofmt -w .

Таким образом, gofmt обрабатывает весь проект сразу.

Проверка без внесения изменений

Если вы хотите просто проверить, требуется ли форматирование, но не вносить изменения, выполните:

gofmt -l .

Эта команда выведет список файлов, которые не соответствуют стандарту.

Дополнительные инструменты

Хотя gofmt — основной инструмент, существуют другие утилиты, которые помогают улучшить читаемость кода и следить за стилем.

goimports

Этот инструмент не только форматирует код, но и автоматически управляет импортами: добавляет недостающие и удаляет неиспользуемые.

Установка:

go install golang.org/x/tools/cmd/goimports@latest

Использование:

goimports -w myfile.go

golines

Go по умолчанию не разбивает длинные строки кода, что иногда ухудшает читаемость. golines решает эту проблему.

Установка:

go install github.com/segmentio/golines@latest

Применение:

golines -w myfile.go

Настройки в IDE

Большинство редакторов поддерживают автоматическое форматирование кода с помощью gofmt или goimports.

В VS Code:

  1. Откройте настройки (Ctrl + Shift + P → Preferences: Open Settings (JSON)).
  2. Добавьте:
"[go]": {
    "editor.formatOnSave": true,
    "editor.codeActionsOnSave": {
        "source.organizeImports": true
    }
}

Это включит автоматическое форматирование при сохранении файла.

В Goland:

  1. Откройте Settings → Go → Editor.
  2. Включите Reformat code on save.

Заключение

Форматирование кода в Go — это не вопрос предпочтений, а стандарт, который обеспечивается gofmt. Он делает код единообразным, убирает субъективность в обсуждении стиля и экономит время на ревью. Дополнительные инструменты, такие как goimports и golines, помогают автоматически управлять импортами и форматировать длинные строки.

Благодаря автоматизации вам не нужно думать о пробелах и отступах — достаточно запустить gofmt или настроить автоформатирование в редакторе, и ваш код всегда будет соответствовать стандарту.

Стрелочка влевоГенерация кода в GoЧистая архитектура в GolangСтрелочка вправо

Все гайды по Golang

Работа с YAML в GolangПреобразование типов в GolangКонвертация структур в JSON в GolangStrconv в GolangИспользование пакета SQLx для работы с базами данных в GolangРазбираемся с SQL в GolangРазделение строк с помощью функции split в GolangSort в GoПоиск и замена строк в Go - GolangИспользование пакета reflect в GolangРабота с PostgreSQL в GoPointers в GolangПарсинг в GoРабота со списками (list) в GolangПреобразование int в string в GolangРабота с числами с плавающей точкой в GolangРабота с полями в GolangИспользование enum в GolangОбработка JSON в GoЧтение и запись CSV-файлов в GolangРабота с cookie в GolangРегистры в GoКэширование данных в GolangПреобразование byte в string в GolangByte в GoИспользование bufio для работы с потоками данных в GolangДобавление данных и элементов (add) в Go
Логирование в Golang. Zap, Logrus, Loki, GrafanaРабота с Docker-контейнерами в GoИспользование pprof в GolangМеханизмы синхронизации в GolangРабота с пакетом S3 в GolangМониторинг Golang приложений с помощью PrometheusОптимизация проектов на GoПаттерны проектирования в GolangМиграции базы данных в GolangОркестрация контейнеров Go с Kubernetes + DockerGjGo Playground и компилятор GolangИспользование go mod init для создания модулей GolangРабота с переменными окружения (env) в GolangКоманда go build в GolangАвтоматизация Golang проектов — CI/CD с GitLab CI и JenkinsОтладка кода в GolangЧтение и использование конфигурации в приложениях на GolangКомпиляция в GolangКак развернуть Go-приложение на облаке AWSАутентификация в Golang
Сетевые протоколы в GoПеременные в GolangЗначения в GolangДженерик %T и его применение в GolangТипы данных в GolangИспользование tls в GolangИспользование tag в структурах GolangSwitch в GoСтроки в GolangРабота с потоками (stream) в GolangSelect в GoРуны в GoРабота с пакетом params в GolangКонвертация строк в числа в GolangNull, Nil, None, 0 в GoНаименования переменных, функций и структур в GoInt в GolangУстановка GolangЧтение и установка HTTP заголовков в GolangMethods в GolangGoLand — IDE для разработки на Golang от JetBrainsОбработка «not found» в GolangFloat в GolangФлаги командной строки в Go (Golang)Запуск внешних команд в GolangОбработка ошибок в GoИспользование defer в GolangЗначения default в GolangГенерация кода в GoФорматирование кода в GolangЧистая архитектура в GolangКаналы (channels) в GolangПолучение body из HTTP запроса в Golang
Открыть базу знаний