Команда разработки Go представила версию 1.27. Бинарные архивы и установщики доступны на странице загрузок.
Go 1.27 приносит значительные улучшения в языке, инструментарии, runtime и стандартной библиотеке. Ниже — основные изменения релиза.
Изменения в языке
Go 1.27 вносит три заметных обновления в спецификацию языка.
Во-первых, теперь поддерживаются обобщённые методы. Пример из math/rand/v2.Rand:
// Prior to Go 1.27, a separate method on Rand had to be added for each type
// (unsigned integer methods omitted for brevity).
func (r *Rand) Int32N(n int32) int32
func (r *Rand) Int64N(n int64) int64
func (r *Rand) IntN(n int) int
// Go 1.27 adds a new generic method that works for all integer types.
func (r *Rand) N[Int intType](n Int) Int
Во-вторых, ключом в литерале структуры теперь может быть любой корректный селектор поля структурного типа, что позволяет напрямую инициализировать поля вложенных или встроенных структур:
type Habitat struct {
Burrow string
}
type Gopher struct {
Name string
Habitat // Embedded struct.
}
// Go 1.27 allows using Burrow as a key directly.
g := Gopher{
Name: "Gopher",
Burrow: "Burrow #42",
}
В-третьих, вывод типов функций обобщён и теперь применяется во всех контекстах присваивания. Обобщённые функции можно использовать без явных типовых аргументов в композитных литералах, преобразованиях типов и отправке в канал:
func GenericFormatter[T any](v T) string {
return fmt.Sprintf("value: %v", v)
}
type IntFormatter func(int) string
// Go 1.27 infers T = int in composite literals, conversions, and channel sends.
formatters := []IntFormatter{GenericFormatter}
fn := IntFormatter(GenericFormatter)
ch := make(chan IntFormatter, 1)
ch <- GenericFormatter
Улучшения инструментов
go fixполучил несколько новых модернизаторов:atomictypes,embedlit,slicesbackwardиunsafefuncs.go docтеперь поддерживает запросы видаpackage@version, напримерgo doc example.com/pkg@v1.2.3.go mod tidyавтоматически объединяет несколько блоковrequireвgo.modв стандартную структуру из двух блоков — прямых и транзитивных зависимостей.
Производительность и runtime
- Специализированное по размеру выделение памяти снижает стоимость аллокации мелких объектов (менее 80 байт) до 30%, что повышает общую производительность программ с интенсивным выделением памяти примерно на 1%.
- Профиль
goroutineleakвruntime/pprofпереведён в статус общедоступного и позволяет автоматически обнаруживать навсегда заблокированные горутины.
Новое в стандартной библиотеке
encoding/json/v2предоставляет высокоуровневую обработку JSON с настраиваемыми опциями и более строгими значениями по умолчанию, а такжеencoding/json/jsontextдля низкоуровневого потокового разбора. Существующий пакетencoding/jsonтеперь работает на базе реализации v2, что ускоряет unmarshaling при сохранении обратной совместимости.crypto/mldsaреализует постквантовую схему цифровой подписи ML-DSA (FIPS 204), интегрированную вcrypto/x509иcrypto/tls.- Пакет
uuidобеспечивает встроенную поддержку генерации и разбора UUID. - Пакеты
simdи архитектурно-специфичныйsimd/archsimdпредоставляют экспериментальную поддержку SIMD. net/http/httptestполучил функциюNewTestServer, предоставляющую эмулированную in-memory сеть, подходящую для использования вместе с пакетомtesting/synctest.
Полный список изменений и подробности доступны в примечаниях к релизу Go 1.27.
В течение следующих недель выйдут отдельные посты, подробнее разбирающие некоторые темы, связанные с Go 1.27.
Команда Go поблагодарила всех, кто внёс вклад в этот релиз: писал код, сообщал об ошибках, тестировал экспериментальные добавления и пробовал релиз-кандидаты. При обнаружении проблем предлагается заводить issue в трекере проекта.