Что такое Go Modules
Go Modules — система управления зависимостями, представленная в Go 1.11. Она заменила GOPATH и vendor-подход.
▸Ключевые файлы
Создание модуля
1# Инициализация модуля2go mod init github.com/user/myproject34# Добавление зависимости5go get github.com/gin-gonic/gin@latest6go get github.com/lib/pq@v1.10.078# Удаление неиспользуемых зависимостей9go mod tidy1011# Загрузка зависимостей12go mod download
go.mod
1module github.com/user/myproject23go 1.2145require (6 github.com/gin-gonic/gin v1.9.17 github.com/lib/pq v1.10.98 github.com/stretchr/testify v1.8.49)1011require (12 github.com/bytedance/sonic v1.10.2 // indirect13 // ... другие indirect зависимости14)
▸Основные директивы
Семантическое версионирование
▸Формат
1v<major>.<minor>.<patch>2v1.2.3
▸Правила
▸Версии без запятых (pre-release)
1v1.2.3-beta.12v1.2.3-rc.13v1.2.3-alpha.1
Вендоринг
1# Создание vendor директории2go mod vendor34# Использование vendor5go build -mod=vendor ./...67# Проверка vendor8go mod verify
▸Когда использовать вендоринг
Replace и Exclude
▸Replace
1// Замена на локальную версию2replace github.com/gin-gonic/gin => ../local/gin34// Замена версии5replace github.com/gin-gonic/gin v1.9.1 => github.com/gin-gonic/gin v1.9.067// Условный replace8replace (9 github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.9.110)
▸Exclude
1exclude (2 github.com/gin-gonic/gin v1.9.03 github.com/lib/pq v1.10.04)
Практические примеры
▸Работа с зависимостями
1# Просмотр дерева зависимостей2go mod graph34# Просмотр всех доступных версий5go list -m -versions github.com/gin-gonic/gin67# Обновление до последней версии8go get -u github.com/gin-gonic/gin@latest910# Обновление минорных версий11go get -u=patch github.com/gin-gonic/gin
▸Закрепление версий
1# Закрепить конкретную версию2go get github.com/gin-gonic/gin@v1.9.134# Закрепить коммит5go get github.com/gin-gonic/gin@abc123def67# Закрепить ветку8go get github.com/gin-gonic/gin@main
Частые задачи
▸Добавление зависимости
1go get github.com/new/dependency@latest2go mod tidy
▸Обновление всех зависимостей
1go get -u ./...2go mod tidy
▸Проверка уязвимостей
1govulncheck ./...
Заключение
Go modules — стандарт управления зависимостями в Go. Понимание go.mod, семантического версионирования и вендоринга важно для поддержания здорового проекта. На собеседовании спрашивают про разницу между require и indirect, как обновлять зависимости и когда использовать вендоринг.