---
id: 149c0672eec2caba57477612564e9368
author: Lemon Mint
title: 'Преглед на Go 1.24: Swiss Table карти, ML-KEM, os.Root и testing/synctest'
description: 'Техническо предоставяне на Go 1.24: вградени карти на базата на Swiss Table, crypto/mlkem (FIPS 203), TLS Encrypted Client Hello, runtime.AddCleanup, os.Root и testing/synctest.'
language: bg
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 реализация на 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](/assets/images/whats-new-in-go1.24/overview.webp)
