Вышла версия Go 1.27 с обобщёнными методами, JSON v2 и более быстрым выделением памяти
Команда Go выпустила Go 1.27, последнее крупное обновление популярного языка программирования с открытым исходным кодом, спустя шесть месяцев после выхода Go 1.26. Как обычно, релиз поддерживает совместимость с Go 1, поэтому почти все существующие программы на Go должны продолжать компилироваться и работать без изменений.
Пожалуй, самое значительное изменение на уровне языка в Go 1.27 — это поддержка обобщённых методов. В объявлениях методов теперь можно указывать собственные параметры типа, что позволяет использовать обобщённую функциональность непосредственно в пространстве имён конкретного типа данных, а не требовать от разработчиков объявления обобщённой функции на уровне пакета.
Вывод типа функции также был обобщён и теперь применяется во всех контекстах, где обобщённая функция присваивается или преобразуется в соответствующий тип функции.
В 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 версии 2 введены более строгие настройки по умолчанию, которые отклоняют недопустимые строки в кодировке 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, что позволяет учитывать изменения, внесенные в версии 16 и 17.
Наконец, изменились требования к платформе для пользователей macOS. Как уже сообщалось ранее, для Go 1.27 теперь требуется macOS 13 Ventura или более новая версия. В 64-битном порту PowerPC с обратным порядком байтов в Linux набор инструментов переключается на ABI ELFv2 и добавляет поддержку cgo, позиционно-независимых исполняемых файлов и внешних ссылок.
Подробнее см. официальное объявление или примечания к выпуску.
Редактор: AndreyEx