Вышел Go 1.26: до 40% быстрее GC, дешевле cgo и экспериментальный SIMD

Что еще нового в релизе?

Обложка: Вышел Go 1.26: до 40% быстрее GC, дешевле cgo и экспериментальный SIMD

Go 1.26 вышел спустя полгода разработки. Релиз традиционно без фанфар, но с ощутимыми изменениями под капотом: ускорили сборку мусора, удешевили вызовы C-кода, усилили защиту рантайма и добавили несколько экспериментальных пакетов.

Новый GC по умолчанию: минус до 40% накладных расходов

Так, в релизе включён сборщик мусора greenteagc. Он оптимизирован для частого создания и сканирования мелких объектов.

В приложениях с активной аллокацией это даёт снижение накладных расходов GC на 10–40%. Если у вас сервис с короткоживущими структурами, это обновление может стать бесплатным ускорением, без изменения кода.

cgo стал дешевле

Вызовы функций на C через cgo также подешевели примерно на 30%. Это важно для проектов, которые тянут нативные библиотеки (криптография, обработка изображений, старый C-код).

Дополнительно в runtime для 64-битных платформ включили рандомизацию адресного пространства (heap base). Это усложняет эксплуатацию уязвимостей в C-коде, подключённом через cgo. При необходимости можно отключить через:

			GOEXPERIMENT=norandomizedheapbase64

		

new() теперь умеет принимать выражения

Встроенная функция new() получила маленькое, но приятное расширение: теперь можно передать выражение для начального значения.

Было:

			x := int64(300)
ptr := &x

		

Теперь можно:

			ptr := new(int64(300))

		

Мелочь, но код становится компактнее и чище.

Обобщённые типы: разрешили «ссылаться на себя»

Generics стали чуть гибче. Теперь тип может передавать сам себя в список параметров типа:

			type Adder[A Adder[A]] interface {
    Add(A) A
}

func algo[A Adder[A]](x, y A) A {
    return x.Add(y)
}

		

Раньше такая самоссылка вызывала ошибку. Теперь — нет. Для сложных generic-алгоритмов это снимает лишние ограничения.

Больше аллокаций в стеке, меньше в куче

Компилятор расширил список случаев, когда слайсы размещаются в стеке, а не в куче. А так как меньше давления на GC, то и выше производительность.

go fix переписали полностью

Команду go fix переписали на базе пакета analysis. Теперь она использует анализаторы из пакета modernize, которые предлагают правки с учётом новых возможностей языка и стандартной библиотеки.

Также появился анализатор inline — он разворачивает вызовы функций, помеченных директивой:

			//go:fix inline
		

Новые пакеты

В стандартную библиотеку добавили:

  • crypto/hpke — реализация Hybrid Public Key Encryption
  • crypto/mlkem/mlkemtest
  • testing/cryptotest

Появился экспериментальный simd/archsimd — низкоуровневый доступ к SIMD-инструкциям на AMD64. Это первый осторожный шаг Go в сторону управляемых векторных вычислений без ассемблера.

Также добавили экспериментальный runtime/secret для безопасного обнуления временной памяти и новый профиль goroutineleak в runtime/pprof — для поиска утечек горутин.

Скачать Go 1.26 можно по ссылке.