1. Старт: установка, инструменты, структура проекта и go mod
Старт: установка, инструменты, структура проекта и go mod
Go удобно изучать, если вы уже работали с Python и PHP: вы узнаете знакомые идеи (пакеты, зависимости, тесты), но в более строгой и инструментально-стандартизированной форме. В этой статье вы настроите окружение, разберётесь с базовыми утилитами, типовой структурой проекта и модульной системой go mod.
Установка Go
Официальная сборка Go включает компилятор, стандартную библиотеку и набор инструментов командной строки.
Если команда отрабатывает и выводит версию (например, go1.22.x), базовая установка готова.
Важные переменные окружения
В отличие от старого подхода с GOPATH как центром всего, современные проекты обычно используют модули (Go Modules). Тем не менее некоторые переменные полезно понимать.
GOROOT — где установлен Go (обычно выставлять вручную не нужно).GOPATH — рабочая директория для кешей, установленных инструментов и старых GOPATH-проектов (по умолчанию часто GOPATH/bin (или $HOME/go/bin при стандартных настройках). Убедитесь, что этот каталог находится в PATH.IDE и редакторы
Минимальный проект: первый модуль
В Go современная точка входа в проект — это модуль (module), описанный в go.mod.
main.go:Здесь важно:
package main и func main() означают исполняемую программу.go run . запускает пакет в текущем каталоге (аналог «собрать и выполнить»).Как Go организует код: пакеты и импорты
В Go пакет — это набор .go файлов в одной директории, которые компилируются вместе.
Пример (условно): если модуль example.com/hello-go, а пакет лежит в internal/app, то импорт будет example.com/hello-go/internal/app.
Типовая структура проекта
Go не навязывает единственный «скелет» проекта на уровне языка, но есть распространённые соглашения.
Один из популярных ориентиров: Standard Go Project Layout. Это не официальный стандарт, но полезный набор идей.
Часто встречающиеся директории:
cmd/ — точки входа в приложения (несколько бинарников в одном репозитории).internal/ — пакеты, которые нельзя импортировать извне модуля (языковое правило видимости).pkg/ — пакеты, которые предполагаются как публично переиспользуемые (используйте аккуратно; часто достаточно internal/).api/ — схемы API (например, OpenAPI/Swagger, protobuf), если применимо.configs/ — конфиги (но секреты хранить отдельно).!Пример типовой структуры Go-проекта и привязка пакетов к директориям
Go Modules: что такое go.mod и зачем он нужен
Модуль — это единица версионирования и распространения зависимостей в Go. Он описывается файлом go.mod в корне проекта.
go.mod
Файл go.mod хранит:
example.com/hello-go;Пример go.mod:
Официальная справка: Go Modules Reference.
go.sum
go.sum содержит контрольные суммы модулей для воспроизводимости загрузки. Обычно его коммитят в репозиторий вместе с go.mod.
Почему это отличается от Python/PHP
В Python и PHP вам почти всегда нужен отдельный инструмент менеджмента окружений и зависимостей (pip/poetry, composer) и отдельное понятие «виртуального окружения». В Go:
go.sum;go install ...@version.Сравнение на высоком уровне:
| Задача | Python | PHP | Go |
|---|---|---|---|
| Описать зависимости | requirements.txt / pyproject.toml | composer.json | go.mod |
| Зафиксировать целостность | poetry.lock | composer.lock | go.sum |
| Установка зависимостей | вручную командой | вручную командой | автоматически при go build/test |
| Форматирование | разные инструменты | разные инструменты | стандарт: gofmt / go fmt |
Полезные команды go mod
go mod init <module> — создать go.mod.go mod tidy — привести зависимости в порядок: добавить нужные, удалить неиспользуемые.go mod download — скачать зависимости заранее.go mod graph — показать граф зависимостей.go mod why <module> — объяснить, почему модуль нужен.go mod vendor — положить зависимости в папку vendor/ (иногда требуется в корпоративной среде).replace для локальной разработки
Иногда нужно временно подменить зависимость на локальную копию (например, вы одновременно правите библиотеку и сервис). Для этого используют replace.
Пример:
Важно: replace обычно не коммитят в основную ветку продукта (или коммитят осознанно), потому что он привязывает сборку к локальному пути.
Приватные репозитории
Если зависимости лежат в приватных Git-репозиториях, Go может пытаться ходить через публичные прокси/сумм-хранилища. Это настраивается переменными окружения, например GOPRIVATE.
Официальная документация: Private modules.
Рабочий цикл: минимум команд на каждый день
Итоги
go version и go env.go ..., а формат кода стандартизирован через go fmt..go файлами) и модулем (единица зависимостей с go.mod).go mod и типовой структурой проекта.