Как выбираются версии зависимостей: минимальные версии вместо максимальных
Go выбирает версии не так, как npm или pip. Алгоритм называется выбор минимальной версии: для каждого модуля берётся наибольшая из минимально требуемых версий по всему графу зависимостей — то есть максимум из того, что кто-то явно потребовал, но не максимум из существующих. Если ваш модуль требует библиотеку v1.2.0, а зависимость — v1.4.0, будет выбрана v1.4.0; вышедшая вчера v1.9.0 не подтянется, пока её не потребуют явно. Отсюда два важных свойства. Сборка воспроизводима без файла блокировки: результат зависит только от содержимого go.mod всех участников, поэтому отдельный package-lock.json в Go не нужен. И обновления никогда не происходят сами: чтобы получить новую версию, её надо запросить командой go get. Побочный эффект — в графе оказывается только одна версия каждого модуля, поэтому конфликт мажорных версий решается суффиксом пути импорта, а не сосуществованием копий.