Команда разработки 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 в трекере проекта.