Ответ вслух Senior Тесты, бенчмарки и модули обновлено

Модули Go: версии и зависимости

Вопрос

Объясните, как работают модули Go: go.mod, go.sum, выбор версий, мажорные версии, приватные зависимости, обновление.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Модуль описывается go.mod: путь модуля, директива go (минимальная версия языка, от неё зависит, например, семантика переменной цикла), toolchain (какую версию тулчейна предпочесть, с Go 1.21 go скачает её сам), require с версиями зависимостей, replace для подмены и exclude.

Что должно прозвучать в ответе

  • go.mod: путь модуля, директива go и toolchain, require, replace, exclude

  • MVS: максимум из минимальных требований, воспроизводимость без lock-файла

  • go.sum и sum.golang.org для проверки целостности, GOPROXY

  • v2+ в пути импорта, правило импортной совместимости

  • Приватные модули: GOPRIVATE, GONOSUMDB, доступ по токену

  • Обновление: go get -u, go list -m -u all, govulncheck; go.work для монорепо

Что могут спросить следом

  • Что делает директива toolchain?
  • Как временно подключить форк зависимости?

Разбор

Модуль описывается go.mod: путь модуля, директива go (минимальная версия языка, от неё зависит, например, семантика переменной цикла), toolchain (какую версию тулчейна предпочесть, с Go 1.21 go скачает её сам), require с версиями зависимостей, replace для подмены и exclude. Версии выбираются по MVS: каждое требование означает «не ниже», и берётся максимум по графу, поэтому без lock-файла сборка воспроизводима, а новые версии сами не приезжают. go.sum хранит хеши, а при первом скачивании они сверяются с sum.golang.org. Модули качаются через GOPROXY, по умолчанию proxy.golang.org. Несовместимые версии с v2 имеют суффикс в пути, и v1 с v2 могут жить в одной сборке. Приватные модули: GOPRIVATE=gitlab.company.ru/*, тогда go идёт напрямую в git и не проверяет хеши в публичной базе, доступ через .netrc или токен. Обновляю go get -u ./... или точечно, смотрю go list -m -u all, проверяю уязвимости govulncheck. Форк подключаю через replace. Несколько модулей в одном репо удобно связывать через go.work.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.