Перейти до змісту

Кілька версій Go та оголошення мінімальної версії

Директива go — оголошує мінімум

У go.mod:

go 1.23.0

З офіційної документації по toolchain:

"Рядок go оголошує мінімально необхідну версію Go для використання модуля або робочого простору."

Що це фактично означає:

  1. Керує мовними функціями. Модуль з go 1.23.0 може використовувати мовні можливості, додані до Go 1.23 включно (наприклад, ітератори range-over-func, введені в 1.23). Старіші toolchain відмовляться збирати такий модуль.
  2. Слугує нижньою межею відмови. "Go 1.21.2 відмовиться завантажувати модуль або робочий простір з рядком go 1.21.3 або go 1.22" (дослівна цитата).
  3. Встановлює транзитивну нижню межу. Ваш рядок go має бути ≥ найвищого рядка go серед ваших залежностей.

Директива toolchain — бажана версія для збирання

go 1.21.0
toolchain go1.23.4

Рядок go вказує мінімум, що вимагає мова; рядок toolchain вказує, яка версія має фактично використовуватися для збирання.

Якщо розробник має встановлений Go 1.21.0 локально, а у go.mod написано toolchain go1.23.4, команда go автоматично завантажить і переключиться на Go 1.23.4 для збирання (за умови стандартного GOTOOLCHAIN=auto).

Якщо ви не пишете рядок toolchain, він неявно вважається toolchain go<ваш-рядок-go>. Тобто:

go 1.21.0

поводиться так, наче ви написали:

go 1.21.0
toolchain go1.21.0

Автоматичне переключення на новіші toolchain

Встановлений бінарний файл Go є також завантажувачем, що може завантажувати інші версії toolchain на вимогу.

"Коли команда зустрічає модуль, що вимагає новішої версії Go, і GOTOOLCHAIN дозволяє запускати інші toolchain (тобто є однією з форм auto або path), команда go вибирає і переключається на відповідний новіший toolchain для продовження виконання поточної команди."

Ви побачите вивід на кшталт:

go: module example.com/widget@v1.2.3 requires go >= 1.24rc1; switching to go 1.27.9

Завантажені 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 install golang.org/dl/go1.22.3@latest
go1.22.3 download
go1.22.3 version
go1.22.3 build ./...

Кожна версія стає окремою командою. Повний список — на go.dev/dl/#stable.

3. Менеджер версій

asdf з плагіном Go або gvm. Корисно, якщо ви хочете глобально перемикати свій типовий Go між кількома версіями поза контролем go.mod.

Розумна відправна точка для нових проєктів

module example.com/yourthing

go 1.23

Пропустіть рядок toolchain, доки у вас немає конкретної причини фіксувати версію (наприклад, "кожен розробник і CI повинні використовувати рівно 1.23.4"). Коли така потреба виникне, додайте його через go get toolchain@go1.23.4, а не вручну.

Джерела