GoSuda

Преглед на Go 1.24: Swiss Table карти, ML-KEM, os.Root и testing/synctest

By Lemon Mint views ...

Go 1.24 се оформя като значим релийз, въвеждащ редица подобрения, насочени към производителността, сигурността и опита на разработчиците. Тези промени имат за цел да направят Go още по-мощен и ефективен за създаване на съвременни приложения.

Повишаване на производителността

Общо подобрение на производителността с 2-3% намаление на натоварването на процесора в набор от представителни бенчмаркове. Тези подобрения включват нова вградена реализация на map, по-ефективно заделяне на памет за малки обекти и нова вътрешна за runtime реализация на 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 и може да бъде деактивирана с build флага GOEXPERIMENT=noswissmap.

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

Подобрена производителност при модификации на map в sync.Map. Модификациите на несвързани множества от ключове са значително по-малко склонни към конкуренция при по-големи map-ове, а вече не е необходимо време за затопляне, за да се постигне натоварване с ниска конкуренция от map-а. При проблеми може да се върнете към старата реализация чрез GOEXPERIMENT=nosynchashtriemap.

Разширено JSON маршалиране

Нова опция omitempty за по-интелигентно пропускане на полета на структури при JSON маршалиране. При маршалиране поле на структура с опцията omitempty се пропуска, ако стойността му е нулева. Ако типът на полето има метод IsZero() bool, той се използва за определяне дали стойността е нулева.

Почистване в runtime

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

Директиви за инструменти в go.mod

Подобрено проследяване на изпълними зависимости чрез директиви за инструменти в go.mod. Това премахва необходимостта от предишното заобиколно решение с добавяне на инструменти като blank imports в файл, конвенционално наречен „tools.go“.

Ограничен до директория достъп

Нов тип os.Root за контролирани файлови операции. Типът os.Root предоставя възможност за извършване на файлови операции в рамките на определена директория, като предотвратява достъпа извън зададения път.

Подобрения в тестването

Нов пакет testing/synctest за тестване на конкурентен код. Функцията synctest.Run стартира група горутини в изолирано „балонче“, а функцията synctest.Wait изчаква всички горутини в текущото балонче да блокират. Този пакет е експериментален и трябва да бъде активиран чрез задаване на GOEXPERIMENT=synctest по време на build.

Build кеш

Изпълнимите файлове от go run вече се кешират за по-бързо изпълнение. Това прави повторните изпълнения по-бързи за сметка на по-голям размер на кеша.

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

Нови анотации #cgo noescape и #cgo nocallback за по-добра производителност на Cgo. #cgo noescape cFunctionName указва на компилатора, че паметта, подадена на C функцията, не напуска контекста ѝ (не escape-ва). #cgo nocallback cFunctionName указва на компилатора, че C функцията не извиква обратно никакви Go функции.

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

Поддръжка на слаби указатели за безопасно препратване към памет без да се предотвратява нейното освобождаване. Слабите указатели са примитив от ниско ниво, предоставен за създаване на структури с ефективно използване на паметта, като слаби map-ове за свързване на стойности, map-ове за каноникализация и различни видове кешове.

Подобрение на бенчмарковете

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

Go 1.24 се оформя като значим релийз, предлагащ съществени подобрения в различни аспекти на езика и неговата екосистема.

Overview of Go 1.24