Кілька версій Go та оголошення мінімальної версії¶
Директива go — оголошує мінімум¶
У go.mod:
З офіційної документації по toolchain:
"Рядок
goоголошує мінімально необхідну версію Go для використання модуля або робочого простору."
Що це фактично означає:
- Керує мовними функціями. Модуль з
go 1.23.0може використовувати мовні можливості, додані до Go 1.23 включно (наприклад, ітератори range-over-func, введені в 1.23). Старіші toolchain відмовляться збирати такий модуль. - Слугує нижньою межею відмови. "Go 1.21.2 відмовиться завантажувати модуль або робочий простір з рядком
go 1.21.3абоgo 1.22" (дослівна цитата). - Встановлює транзитивну нижню межу. Ваш рядок
goмає бути ≥ найвищого рядкаgoсеред ваших залежностей.
Директива toolchain — бажана версія для збирання¶
Рядок go вказує мінімум, що вимагає мова; рядок toolchain вказує, яка версія має фактично використовуватися для збирання.
Якщо розробник має встановлений Go 1.21.0 локально, а у go.mod написано toolchain go1.23.4, команда go автоматично завантажить і переключиться на Go 1.23.4 для збирання (за умови стандартного GOTOOLCHAIN=auto).
Якщо ви не пишете рядок toolchain, він неявно вважається toolchain go<ваш-рядок-go>. Тобто:
поводиться так, наче ви написали:
Автоматичне переключення на новіші toolchain¶
Встановлений бінарний файл Go є також завантажувачем, що може завантажувати інші версії toolchain на вимогу.
"Коли команда зустрічає модуль, що вимагає новішої версії Go, і
GOTOOLCHAINдозволяє запускати інші toolchain (тобто є однією з формautoабоpath), командаgoвибирає і переключається на відповідний новіший toolchain для продовження виконання поточної команди."
Ви побачите вивід на кшталт:
Завантажені toolchain пакуються як звичайні модулі за шляхом golang.org/toolchain і кешуються в $GOMODCACHE — через той самий проксі та базу контрольних сум, що й інші залежності.
Змінна середовища GOTOOLCHAIN¶
Встановлюється через go env -w GOTOOLCHAIN=... (зберігається між сесіями оболонки) або у поточному середовищі оболонки.
| Значення | Поведінка |
|---|---|
auto (типово) |
Використовує вбудований toolchain; автоматично завантажує новіший, якщо цього вимагає модуль. |
local |
Ніколи не переключається. Завжди використовує той бінарний файл go, який ви запустили. Старіші модулі збираються; модулі, що вимагають новішого рядка go, завершаться з помилкою. |
go1.21.3 (точна версія) |
Завжди використовує цю конкретну версію. Завантажує її за потреби. |
go1.21.3+auto |
Починає з 1.21.3, але все одно оновлюється, якщо модуль вимагає більшого. |
go1.21.3+path |
Починає з 1.21.3, дозволяє оновлення, але тільки з $PATH — без завантажень. Для закритих або ізольованих середовищ. |
Редагування директив — використовуйте go get, а не ручні зміни¶
go get go@1.22.1 # підняти мінімум до 1.22.1
go get go@1.22.1 toolchain@go1.24.0 # підняти обидва
go get toolchain@none # видалити явний рядок toolchain
go get обробляє взаємодію між двома рядками за вас. Підняття рядка go автоматично скоригує або видалить рядок toolchain, якщо вони інакше збіглися б.
Запуск кількох версій Go паралельно¶
Три поширені варіанти.
1. Автоматичне завантаження toolchain (сучасний типовий варіант)¶
З GOTOOLCHAIN=auto вам нічого не потрібно робити. Різні проєкти на тій самій машині прозоро використовують ті версії Go, які вказані в їхніх файлах go.mod.
2. Офіційний спосіб через go install¶
Для разового тестування конкретної версії без зміни основного встановлення:
Кожна версія стає окремою командою. Повний список — на go.dev/dl/#stable.
3. Менеджер версій¶
asdf з плагіном Go або gvm. Корисно, якщо ви хочете глобально перемикати свій типовий Go між кількома версіями поза контролем go.mod.
Розумна відправна точка для нових проєктів¶
Пропустіть рядок toolchain, доки у вас немає конкретної причини фіксувати версію (наприклад, "кожен розробник і CI повинні використовувати рівно 1.23.4"). Коли така потреба виникне, додайте його через go get toolchain@go1.23.4, а не вручну.