GoSuda

Обзор релиза Go 1.24: таблицы Swiss Table для отображений, ML-KEM, os.Root и testing/synctest

By Lemon Mint views ...

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