Обновление версии Go: директива go, строка toolchain и автоматическая загрузка
В go.mod две разные версии, и их постоянно путают. Директива go задаёт версию языка: какие возможности синтаксиса разрешены и какие изменения поведения включены — например, посвязочная переменная цикла появилась при go 1.22, и понижение директивы вернёт старую семантику. Строка toolchain задаёт минимальную версию инструментов, которыми модуль собирают. Связывает их переменная GOTOOLCHAIN: при значении auto (умолчание обычной установки) команда go сама скачает и запустит нужную версию, если локальная старее требуемой, — то есть новый проект соберётся даже на старом установленном Go. Значение local это запрещает и выдаёт ошибку, и именно так настроены официальные образы Docker. Отсюда практика обновления: сначала поднять toolchain и убедиться, что всё зелёное, и только потом поднимать директиву go, потому что она включает изменения поведения. Гарантия совместимости Go работает в обе стороны: старый код собирается новым тулчейном.