· 7 мин 👁 1.4k Начинающий

Язык Go - форматирование кода

Почему в Go не спорят о табах и пробелах, что такое gofmt и как он избавляет вас от головной боли.

форматирование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 — как правильно документировать свой код.