---
id: 149c0672eec2caba57477612564e9368
author: Lemon Mint
title: 'Обзор релиза Go 1.24: таблицы Swiss Table для отображений, ML-KEM, os.Root и testing/synctest'
description: 'Технический обзор Go 1.24: встроенные map на основе Swiss Table, crypto/mlkem (FIPS 203), TLS Encrypted Client Hello, runtime.AddCleanup, os.Root и testing/synctest.'
language: ru
date: 2024-12-20T00:23:21.60729Z
path: /blog/posts/whats-new-in-go-1-24-z83ff24d2
category: release
---

Go 1.24 обещает стать значительным релизом, включающим ряд улучшений, направленных на производительность, безопасность и удобство для разработчиков. Эти изменения призваны сделать Go еще более мощным и эффективным инструментом для создания современных приложений.

## Повышение производительности

Общее улучшение производительности, выраженное в снижении накладных расходов процессора на 2–3% в наборе репрезентативных бенчмарков. Эти улучшения включают новую встроенную реализацию отображений (map), более эффективное выделение памяти для небольших объектов и новую внутреннюю реализацию мьютекса среды выполнения (runtime-internal mutex). Результаты могут различаться в зависимости от приложения.

## Постквантовая криптография

Введение пакета `crypto/mlkem`, реализующего ML-KEM-768 и ML-KEM-1024. ML-KEM является механизмом постквантового обмена ключами, ранее известным как Kyber и описанным в FIPS 203. Это дополнение подготавливает Go к будущему криптографической безопасности.

## Улучшение TLS

Поддержка Encrypted Client Hello (ECH) в TLS. Эта функция может быть включена путем заполнения поля `Config.EncryptedClientHelloKeys`, что повышает конфиденциальность и безопасность TLS-соединений.

## Новая реализация map на основе Swiss Table

Усовершенствованная реализация отображений для повышения производительности. Новая реализация основана на Swiss Tables и может быть отключена с помощью флага сборки `GOEXPERIMENT=noswissmap`.

## Обновление sync.Map

Улучшена производительность модификаций в `sync.Map`. Модификации непересекающихся наборов ключей значительно реже конкурируют за доступ в больших отображениях, а для достижения низкоконкурентной нагрузки на отображение больше не требуется времени на разогрев. Если вы столкнетесь с проблемами, можно вернуться к прежней реализации, используя `GOEXPERIMENT=nosynchashtriemap`.

## Улучшенная маршализация JSON

Новая опция тега `omitempty` для более точного исключения полей структуры при маршализации JSON. При маршализации поле структуры с опцией `omitempty` будет опущено, если его значение является нулевым. Если тип поля имеет метод `IsZero() bool`, то для определения нулевого значения будет использоваться именно он.

## Очистка среды выполнения

Введение функции `AddCleanup` для замены `SetFinalizer` с целью улучшения управления ресурсами. В отличие от `SetFinalizer`, она не воскрешает объект, к которому прикреплена, для финализации, а к одному объекту можно прикрепить несколько функций очистки. Новому коду рекомендуется использовать `AddCleanup` вместо `SetFinalizer`.

## Директивы инструментов в go.mod

Улучшено отслеживание исполняемых зависимостей с помощью директив инструментов (tool directives) в `go.mod`. Это устраняет необходимость в прежнем обходном решении, при котором инструменты добавлялись как анонимные импорты в файл, традиционно называемый «tools.go».

## Ограничение доступа каталогом

Новый тип `os.Root` для контролируемых операций с файловой системой. Тип `os.Root` обеспечивает возможность выполнять операции с файловой системой в пределах определенного каталога, предотвращая доступ за пределы указанного пути.

## Улучшения тестирования

Новый пакет `testing/synctest` для тестирования конкурентного кода. Функция `synctest.Run` запускает группу горутин в изолированном «пузыре» (bubble), а функция `synctest.Wait` ожидает, пока все горутины в текущем пузыре не заблокируются. Этот пакет является экспериментальным и должен быть включен установкой `GOEXPERIMENT=synctest` при сборке.

## Кэш сборки

Исполняемые файлы, запускаемые через `go run`, теперь кэшируются для ускорения выполнения. Это делает повторные запуски быстрее ценой увеличения размера кэша.

## Производительность Cgo

Новые аннотации `#cgo noescape` и `#cgo nocallback` для повышения производительности Cgo. `#cgo noescape cFunctionName` сообщает компилятору, что память, передаваемая в функцию C, не выходит за её пределы (не «экранируется»). `#cgo nocallback cFunctionName` сообщает компилятору, что функция C не вызывает обратно никакие функции Go.

## Слабые указатели

Поддержка слабых указателей (weak pointers) для безопасной ссылки на память без предотвращения её освобождения. Слабые указатели являются низкоуровневым примитивом, предназначенным для создания экономных по памяти структур, таких как слабые отображения для ассоциирования значений, отображения канонизации и различные виды кэшей.

## Улучшение бенчмарков

Новый метод `testing.B.Loop` для более быстрых и менее подверженных ошибкам бенчмарков. Функция бенчмарка будет выполняться ровно один раз на каждое значение `-count`, поэтому дорогостоящие шаги подготовки и очистки выполняются только один раз. Параметры и результаты вызовов функций остаются живыми, что не позволяет компилятору полностью оптимизировать тело цикла.

Go 1.24 обещает стать значительным релизом, предлагающим существенные улучшения различных аспектов языка и его экосистемы.

![Overview of Go 1.24](/assets/images/whats-new-in-go1.24/overview.webp)
