Команда Go выпустила Go 1.27, крупное обновление популярного языка программирования с открытым исходным кодом, через шесть месяцев после Go 1.26. Как обычно, в релизе сохранены обязательства по совместимости Go 1, поэтому почти все существующие программы на Go продолжат компилироваться и работать без изменений.
Пожалуй, самое значительное языковое изменение в Go 1.27 связано с поддержкой обобщённых методов. Объявления методов теперь могут вводить собственные параметры типов, поэтому обобщённая функциональность размещается непосредственно в пространстве имён конкретного типа данных, а не выносится в отдельную generic-функцию уровня пакета.
Вывод типов функций также обобщили, теперь он работает во всех контекстах, где обобщённая функция присваивается или преобразуется к совместимому функциональному типу.
В Go 1.27 также добавлена заметная оптимизация рантайма. Компилятор теперь генерирует вызовы специализированных по размеру процедур выделения памяти, снижая затраты на выделение памяти объёмом меньше 80 байт до 30%. Точный эффект зависит от нагрузки, но команда Go оценивает общее улучшение в реальных приложениях с интенсивным выделением памяти примерно в 1%.
Ещё одно улучшение рантайма: общедоступный профиль goroutineleak, который впервые появился в экспериментальном виде в Go 1.26. Он доступен через runtime/pprof и HTTP-эндпоинт /debug/pprof/goroutineleak и предназначен для выявления горутин, навсегда заблокированных на примитивах конкурентности, таких как каналы, мьютексы и условные переменные.
Одновременно стандартная библиотека получила одно из самых крупных изменений: в неё добавлены пакеты encoding/json/v2 и encoding/json/jsontext. Первый значительно перерабатывает существующий JSON-пакет Go, а jsontext предоставляет более низкоуровневую синтаксическую обработку JSON через кодировщики и декодировщики, работающие с токенами и значениями.
JSON v2 использует более строгие настройки по умолчанию и отклоняет некорректные UTF-8 строки, а также повторяющиеся имена полей объектов. Важно, что существующие приложения не обязаны переходить на новый API. Привычный пакет encoding/json остаётся поддерживаемым, но теперь работает поверх реализации v2, сохраняя прежнее поведение при маршалинге и демаршалинге.
В области криптографии новый пакет crypto/mldsa реализует постквантовую схему цифровой подписи ML-DSA, стандартизированную в FIPS 204. Пакет crypto/x509 теперь поддерживает открытые и закрытые ключи ML-DSA, а также подписи, а TLS 1.3 может использовать подписи ML-DSA через новые схемы подписи MLDSA44, MLDSA65 и MLDSA87.
Go 1.27 также добавляет в стандартную библиотеку новый пакет uuid для генерации и разбора UUID, что снижает потребность во внешних зависимостях для этой распространённой задачи.
С точки зрения производительности релиз впервые представляет экспериментальный пакет simd, который предоставляет переносимые SIMD-операции, не зависящие от размера вектора. Если система поддерживает аппаратные векторные инструкции, пакет задействует их, но при этом предоставляет переносимые векторные типы, например Int8s и Float32s. Возможность подключается явно, на этапе сборки нужно указать GOEXPERIMENT=simd.
Улучшения затронули и инструменты командной строки Go. go test теперь по умолчанию выполняет проверку stdversion из vet, которая помогает находить обращения к API стандартной библиотеки новее, чем версия Go, указанная в модуле.
Для проектов на Go 1.27 или новее go mod tidy теперь автоматически объединяет повторяющиеся секции require максимум в два блока: один для прямых зависимостей и один для косвенных. Комментарии при этом сохраняются. В go fix также добавили несколько новых модернизаторов.
Стек HTTP получил несколько доработок. HTTP/2-сервер Go теперь может учитывать сигналы приоритета клиента из RFC 9218, а тела ответов HTTP/1 при закрытии автоматически считывают ограниченный объём непрочитанных данных, что улучшает повторное использование соединений. Серверы также могут использовать новое поле MaxHeaderValueCount для ограничения числа принимаемых значений заголовков.
Поддержка Unicode перешла с версии 15 сразу на версию 17 и охватывает изменения, появившиеся в Unicode 16 и 17.
Наконец, изменились системные требования для пользователей macOS. Как и анонсировалось ранее, Go 1.27 теперь требует macOS 13 Ventura или новее. В 64-битном big-endian порте PowerPC для Linux тулчейн переходит на ABI ELFv2 и получает поддержку cgo, позиционно-независимых исполняемых файлов и внешнего связывания.
Более подробная информация доступна в официальном анонсе и примечаниях к релизу.




Пока нет комментариев. Будьте первым!