Отступы в Go: табуляция или пробелы? Какой стандарт и почему?
Стандарт Go: табуляция (tabs)
В Go официальный стандарт — использовать табуляцию (символ \t) для отступов. Это закреплено в спецификации языка и в утилите gofmt (которая теперь встроена в go fmt). Вот почему это важно и какие есть причины.
Почему табуляция, а не пробелы?
- Гибкость отображения для разных разработчиков. Табуляция — это символ, который каждый может настроить под себя в редакторе: один разработчик видит отступ в 2 символа, другой — в 4, третий — в 8. Код при этом остаётся одним и тем же. С пробелами такой гибкости нет.
- Доступность. Люди с нарушениями зрения часто используют крупные шрифты или программы экранного доступа. Табуляция позволяет им настроить отступы так, чтобы код был читаем. Пробелы фиксированной ширины могут создавать проблемы.
- Историческая причина. Go создавался в Google, где использовались редакторы с настраиваемой шириной табуляции. Разработчики Go (Роб Пайк, Кен Томпсон) придерживались философии: "один символ — один отступ".
- Согласованность.
gofmtавтоматически преобразует пробелы в табуляцию. Если вы пишете с пробелами,gofmtих не трогает только если они не нарушают стандарт? На самом деле,gofmtне заменяет пробелы на табуляцию автоматически — он оставляет код как есть, если он уже отформатирован. Но если вы передадите код с пробелами, он не сломается, но сообщество ожидает табуляцию.
Практический пример: ваш код с табуляцией
Вот как должен выглядеть ваш код после применения go fmt (если бы вы изначально использовали пробелы, gofmt бы их не тронул, но рекомендуется писать с табуляцией):
package main
import "fmt"
func isEven(n int) bool {
if n%2 == 0 {
return true
} else {
return false
}
}
func main() {
fmt.Println(isEven(4))
}
Обратите внимание: отступ — это один символ табуляции (\t). В редакторе он может выглядеть как 2, 4 или 8 пробелов — это настройка вашего редактора.
Как настроить редактор?
- VS Code: в настройках Go extension по умолчанию использует табуляцию. Убедитесь, что
"editor.insertSpaces": falseдля файлов .go. - Vim/Neovim:
set noexpandtabиset shiftwidth=4(или любое другое значение). - GoLand: по умолчанию использует табуляцию.
Что насчёт выравнивания?
В Go есть один нюанс: для выравнивания (например, в объявлении структур или в комментариях) иногда используют пробелы после табуляции. gofmt сам решает, где нужны пробелы для выравнивания. Пример:
type Point struct {
X int // 4 пробела после табуляции
Y int
Name string
}
Здесь первая табуляция задаёт отступ, а затем идут пробелы для выравнивания имён полей. gofmt управляет этим автоматически.
Итог
Используйте табуляцию для отступов. Запускайте go fmt перед каждым коммитом. Это стандарт сообщества, и он делает код единообразным во всех проектах Go. Ваш код с пробелами не будет отвергнут, но вы будете выглядеть как новичок, который не знает стандартов. Привыкайте к табуляции — это просто и удобно.
Альтернативный взгляд: пробелы тоже работают, но...
Технически вы можете использовать пробелы в Go — компилятору всё равно. gofmt не переписывает ваш код принудительно, если он синтаксически корректен. Однако есть несколько важных "но":
- Сообщество. 99% Go-разработчиков используют табуляцию. Если вы отправите PR с пробелами, вас попросят переделать. Крупные проекты (Kubernetes, Docker, Hugo) требуют
go fmtперед коммитом. - Инструменты.
gofmt,goimports, линтеры (golangci-lint) ожидают табуляцию. Некоторые линтеры (например,wsl) могут ругаться на пробелы. - Совместимость. Если вы используете пробелы, а ваш коллега — табуляцию с шириной 8, код будет выглядеть по-разному. Табуляция гарантирует, что все видят код одинаково (относительно настроек).
Когда пробелы могут быть оправданы?
Только если вы работаете в изолированной среде, где все договорились использовать пробелы (например, в компании со строгими правилами форматирования). Но даже в этом случае лучше использовать gofmt с флагом -tabs=false (экспериментальная опция). Однако это редкое исключение.
Рекомендация
Не боритесь со стандартом. Потратьте 10 минут, чтобы настроить редактор на табуляцию для Go-файлов. Это окупится сотнями часов, которые вы сэкономите на спорах о форматировании. В Go философия: "единый стиль для всех" — и это табуляция.