Какво е новото в Go 1.24?
Go 1.24 се очертава като значимо издание, въвеждащо редица подобрения, фокусирани върху производителността, сигурността и опита на разработчиците. Тези промени целят да направят Go още по-мощен и ефективен за изграждане на модерни приложения.
Увеличаване на производителността
Общо подобрение на производителността с 2-3% намаление на натоварването на процесора в набор от представителни бенчмаркове. Тези подобрения включват нова вградена имплементация на 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 връзките.
Нова Swiss Table Map
Подобрена имплементация на map за по-добра производителност. Тази нова имплементация е базирана на Swiss Tables и може да бъде деактивирана с флага за компилация GOEXPERIMENT=noswissmap
.
Актуализация на Sync Map
Подобрена производителност за модификации на map в sync.Map
. Модификациите на несвързани набори от ключове са много по-малко вероятно да се конкурират при по-големи карти и вече няма нужда от време за разгръщане, за да се постигнат нискоконкурентни натоварвания от картата. Ако срещнете проблеми, можете да се върнете към старата имплементация, използвайки GOEXPERIMENT=nosynchashtriemap
.
Подобрено JSON Marshaling
Нова опция за таг omitempty
за по-интелигентно пропускане на полета на struct по време на JSON marshaling. При marshaling, поле на struct с опция omitempty
ще бъде пропуснато, ако стойността му е нула. Ако типът на полето има метод IsZero() bool
, той ще бъде използван, за да се определи дали стойността е нула.
Почистване на средата на изпълнение
Въвеждане на функцията AddCleanup
за заместване на SetFinalizer
за по-добро управление на ресурсите. За разлика от SetFinalizer
, тя не възкресява обекта, към който е прикачена за финализиране, и множество почиствания могат да бъдат прикачени към един обект. Новият код трябва да предпочита AddCleanup
пред SetFinalizer
.
Директиви за инструменти в go.mod
Подобрено проследяване на изпълними зависимости с помощта на директиви за инструменти в go.mod
. Това премахва необходимостта от предишното заобиколно решение за добавяне на инструменти като празни импорти в файл, традиционно наричан "tools.go".
Ограничен достъп до директории
Нов тип os.Root
за контролирани файлови операции. Типът os.Root
предоставя възможност за извършване на файлови операции в рамките на определена директория, предотвратявайки достъп извън указания път.
Подобрения в тестването
Нов пакет testing/synctest
за тестване на паралелен код. Функцията synctest.Run
стартира група от goroutines в изолиран „балон“, а функцията synctest.Wait
изчаква всички goroutines в текущия балон да блокират. Този пакет е експериментален и трябва да бъде активиран чрез задаване на GOEXPERIMENT=synctest
по време на компилация.
Кеш за компилация
Изпълнимите файлове на go run
вече се кешират за по-бързо изпълнение. Това прави повторните изпълнения по-бързи за сметка на увеличаване на размера на кеша.
Cgo производителност
Нови анотации #cgo noescape
и #cgo nocallback
за по-добра Cgo производителност. #cgo noescape cFunctionName
казва на компилатора, че паметта, предадена на C функцията, не излиза. #cgo nocallback cFunctionName
казва на компилатора, че C функцията не извиква обратно никакви Go функции.
Слаби указатели
Поддръжка на слаби указатели за безопасно рефериране на памет, без да се предотвратява освобождаването ѝ. Слабите указатели са примитив от ниско ниво, предоставен за създаване на ефективни структури за памет, като слаби карти за асоцииране на стойности, карти за канонизация и различни видове кешове.
Подобрение на бенчмарка
Нов метод testing.B.Loop
за по-бързи и по-малко склонни към грешки бенчмаркове. Функцията за бенчмарк ще се изпълни точно веднъж на -count
, така че скъпите стъпки за настройка и почистване се изпълняват само веднъж. Параметрите и резултатите от извикванията на функции се запазват живи, предотвратявайки пълната оптимизация на тялото на цикъла от компилатора.
Go 1.24 се очертава като значимо издание, предлагащо съществени подобрения в различни аспекти на езика и неговата екосистема.