Язык Go - форматирование кода
Почему в Go не спорят о табах и пробелах, что такое gofmt и как он избавляет вас от головной боли.
Содержание
Форматирование кода — тема, которая в любом другом языке гарантированно вызовет холивар в команде. Табы или пробелы? Скобка на этой строке или на следующей? Сколько пустых строк между методами?
В Go подобных споров обычно не происходит. И вот почему.
Что такое gofmt
Авторы Go сделали смелый шаг — вместо того чтобы написать длинный style guide, они написали инструмент, который форматирует код автоматически. Этот инструмент называется gofmt.
Идея проста: если есть один канонический способ форматировать код, и он применяется автоматически — споры исчезают сами собой. Никто не тратит время на ревью с комментариями “поставь пробел после запятой”.
Главное правило: весь Go-код в стандартной библиотеке отформатирован через
gofmt. Ваш код тоже должен быть.
Что такое gofmt
gofmt — это утилита командной строки, которая читает ваш Go-код и выдаёт его в стандартном стиле. Она встроена в Go из коробки.
# Отформатировать один файл (выведет результат в stdout)
gofmt main.go
# Отформатировать файл на месте
gofmt -w main.go
# Отформатировать весь пакет
go fmt ./...
go fmt — это обёртка над gofmt, которая работает на уровне пакета. В реальных проектах используют именно её.
Установка Go
На Windows: скачайте с официального сайта golang.org и установите. На macOS: через Homebrew brew install go или скачайте с сайта. На Linux: через пакетный менеджер (apt, yum, dnf) или скачайте архив с официального сайта.
Что gofmt делает на практике
Выравнивание полей структур
Вот типичная ситуация — вы написали структуру, не думая о выравнивании:
// Как вы написали
type Server struct {
host string // адрес сервера
port int // порт
timeout time.Duration // таймаут соединения
maxConnections int // максимум соединений
}
После gofmt:
// Как стало
type Server struct {
host string // адрес сервера
port int // порт
timeout time.Duration // таймаут соединения
maxConnections int // максимум соединений
}
Читать стало значительно приятнее — и вы не потратили ни секунды на ручное выравнивание.
Отступы: всегда табы
Go использует табы для отступов, не пробелы. gofmt расставит их сам. Спор “табы vs пробелы” в Go официально закрыт.
Расположение открывающей скобки
В Go открывающая фигурная скобка всегда должна идти на той же строке, что и сигнатура функции или управляющей конструкции. Это не рекомендация стиля, а синтаксическое требование.
// правильно
func greet(name string) {
fmt.Println("Привет,", name)
}
// не скомпилируется
func greet(name string)
{
fmt.Println("Привет,", name)
}
Длина строк: без ограничений
В Go нет лимита на длину строки. Если строка слишком длинная — просто перенесите её и добавьте отступ:
// переносим аргументы
result, err := someVeryLongFunctionName(
firstArgument,
secondArgument,
thirdArgument,
)
gofmt не будет принудительно разбивать длинные строки — это остаётся на усмотрение разработчика.
Меньше скобок, чем в C/Java
Управляющие конструкции в Go не требуют скобок вокруг условия:
// go
if x > 0 {
fmt.Println("положительное")
}
// в C/Java скобки обязательны: if (x > 0) { ... }
Настройка редактора
Хорошая новость: вам почти никогда не нужно запускать gofmt вручную. Все популярные редакторы умеют делать это автоматически при сохранении файла.
VS Code — установите расширение Go, форматирование включится само.
GoLand — форматирование встроено, настраивается в Settings → Tools → File Watchers.
Vim/Neovim — через плагин vim-go или LSP с gopls.
Добавьте в настройки VS Code:
{
"[go]": {
"editor.formatOnSave": true
}
}
И забудьте о проблеме навсегда.
goimports: gofmt на стероидах
Есть расширенная версия — goimports. Она делает всё то же самое, что gofmt, плюс автоматически управляет импортами: добавляет нужные и удаляет неиспользуемые.
go install golang.org/x/tools/cmd/goimports@latest
# использование аналогично gofmt
goimports -w main.go
В большинстве проектов используют именно goimports как замену gofmt.
Итоги
gofmt(илиgo fmt ./...) — обязательный инструмент в каждом Go-проекте- Настройте форматирование при сохранении в редакторе — и забудьте об этом
- Табы для отступов, скобка на той же строке, скобок вокруг условий нет
- Если что-то кажется странным — запустите
gofmtи доверьтесь результату goimports=gofmt+ автоуправление импортами, часто предпочтительнее
Форматирование в Go — это одна из тех вещей, которые сначала кажутся мелочью, но со временем начинаешь ценить: весь Go-код выглядит одинаково, и читать чужой код становится гораздо проще.
Следующий шаг: Комментарии и документация в Go — как правильно документировать свой код.