Что нового в Go 1.24?
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 формируется как значительный выпуск, предлагающий существенные улучшения в различных аспектах языка и его экосистемы.