go build / go run
Тема дорожной карты · Golang
go build и go run — два наиболее фундаментальных инструмента Go-тулчейна, обеспечивающих компиляцию и быстрые итерации в процессе Golang-разработки. go build ./... компилирует все пакеты модуля и их зависимости в исполняемые бинарники, принимая флаги компоновщика через -ldflags — например, -ldflags="-s -w" удаляет отладочные символы и DWARF-таблицы, существенно уменьшая размер бинарника для Docker-развёртываний. go run main.go (или go run ./cmd/server) компилирует и выполняет программу за один шаг, кешируя инкрементальные артефакты сборки так, что повторные вызовы go run в процессе разработки выполняются быстро. Кросс-компиляция — первоклассная возможность go build: установка GOOS=linux GOARCH=amd64 создаёт Linux x86-64 бинарник независимо от ОС хоста, что необходимо для многоэтапных Dockerfile. Обе команды учитывают build-теги (//go:build linux), переменную окружения CGO_ENABLED и граф зависимостей, зафиксированный в go.mod и go.sum, обеспечивая воспроизводимые сборки на машинах разработчиков, в CI-пайплайнах и в Kubernetes-развёртываниях.
Как это работает
go build / go run использует 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 — обходит публичный прокси.
Типичные ошибки
Ловушки go build / go run: 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).