GoSuda

Что нового в Go 1.24?

By Lemon Mint
views ...

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

Увеличение Производительности

Общее улучшение производительности со снижением на 2-3% накладных расходов на CPU в наборе репрезентативных бенчмарков. Эти улучшения включают новую встроенную реализацию map, более эффективное выделение памяти для небольших объектов и новую внутреннюю реализацию 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

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

Обновление Sync Map

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

Улучшенное JSON Marshaling

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

Очистка Рантайма

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

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

Улучшенное отслеживание исполняемых зависимостей с использованием директив инструментов в go.mod. Это устраняет необходимость в предыдущем обходном пути добавления инструментов в качестве пустых импортов в файл, традиционно называемый "tools.go".

Ограниченный Доступ к Каталогам

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

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

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

Кэш Сборки

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

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

Новые аннотации #cgo noescape и #cgo nocallback для повышения производительности Cgo. #cgo noescape cFunctionName сообщает компилятору, что память, передаваемая в функцию C, не "утекает". #cgo nocallback cFunctionName сообщает компилятору, что функция C не вызывает Go-функции.

Слабые Указатели

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

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

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

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

Overview of Go 1.24