gofmt и goimports
Тема дорожной карты · Golang
gofmt — канонический форматировщик исходного кода Go: он приводит Go-файлы к единому авторитетному стилю — отступы табуляцией, согласованные пробелы вокруг операторов, выровненные списки полей структур, — устраняя все споры о форматировании в Golang-командах. Команда gofmt -w . форматирует все .go-файлы дерева на месте, и большинство редакторов запускают её автоматически при сохранении через языковой сервер gopls. goimports (golang.org/x/tools/cmd/goimports) — надмножество gofmt, которое также добавляет недостающие пути импорта и удаляет неиспользуемые, что делает его предпочтительным форматировщиком в проектах, активно добавляющих или рефакторящих зависимости. CI-пайплайны, как правило, проверяют форматирование через gofmt -l . (который завершается с ненулевым кодом, если какой-либо файл требует переформатирования) или через golangci-lint с включёнными линтерами gofmt и goimports. Вместе gofmt и goimports — фундаментальные инструменты экосистемы Go; они применяются ко всему Go-коду независимо от того, нацелен ли он на микросервисы, CLI-инструменты, gRPC-серверы или библиотеки.
Как это работает
gofmt и goimports использует Go modules (с 1.11) — go mod init, go mod tidy, go mod download, go.mod + go.sum файлы. Module path — префикс импорта; semver enforced; go-команда обрабатывает vendoring (go mod vendor) и проксирование через proxy.golang.org. Тулчейн: go build, go run, go test, go fmt, go vet, go install, go work (multi-module workspaces). Third-party: staticcheck, golangci-lint.
Когда применять
Всегда коммитьте go.sum (верифицирует контрольные суммы модулей). go mod tidy регулярно — держите go.mod минимальным. replace-директива в go.mod — для локальной разработки зависимости. golangci-lint в CI — пакетирует vet, staticcheck, errcheck и десятки полезных линтеров. Для приватных модулей GOPRIVATE=*.yourcompany.ru — обходит публичный прокси.
Типичные ошибки
Ловушки gofmt и goimports: pre-1.11 GOPATH-workflow (давно мёртв — кто учит этому, учит устаревшему Go); replace-директивы оставлены в production go.mod (используйте build-time-only override); коммит папки vendor/ без -mod=vendor policy в CI; go install вне модуля (в старом Go ставило в $GOPATH/bin, в новом требует @version).