Go 1.24

Новото издание на езика Go, версия 1.24, излиза шест месеца след Go 1.23. Повечето промени се отнасят до реализацията на инструментариума, времето за изпълнение и библиотеките. Както винаги, версията осигурява обещание за съвместимост Go 1. Разработчиците на езика очакват почти всички Go програми да продължат да се компилират и да работят както преди.

Промени в езика

Go 1.24 вече напълно поддържа обобщени алиаси на типове: алиас на тип може да бъде параметриран като обявен тип. Подробности в спецификацията на езика. Въпреки това, възможността може да бъде деактивирана чрез настройка на GOEXPERIMENT=noaliastypeparams; опцията aliastypeparams обаче ще бъде премахната в Go 1.25.

Инструменти

Командата go

Модулите на go сега могат да проследяват изпълними зависимости, използвайки директивата tool в go.mod. Това премахва необходимостта от предишното заобикалящо решение за добавяне на инструменти като празни импорти в файла, обикновено наречен “tools.go”. Командата go tool сега може да стартира тези инструменти в допълнение към инструментите, предоставени с Go. Повече информация може да се види в документацията.

Новият флаг -tool за go get води до добавяне на директива за инструмент към текущия модул за посочените пакети, в допълнение към добавянето на директиви за зависимости.

Нов мета-патерн tool се отнася до всички инструменти в текущия модул. Това може да се използва за актуализиране на всички тях чрез go get tool или за инсталиране в директорията GOBIN чрез go install tool.

Изпълнимите файлове, създадени чрез go run, и новото поведение на go tool сега се кешират в кеша за изграждане на Go. Това прави повторните стартирания по-ефективни благодарение на увеличеното кеширане. #69290.

Командите go build и go install сега приемат флага -json, който съобщава резултата и грешките при изграждане като структурирано JSON извеждане в стандартния изход. Подробности за формата могат да се видят в go help buildjson.

Освен това, go test -json сега докладва резултата и грешките от изграждането в JSON, смесени с JSON-а от резултатите от тестовете. Те могат да се различат по новите типове Action, но ако предизвикат проблеми в системата за интеграционно тестване, може да се върнете към текстовото извеждане на изграждането чрез настройката GODEBUG gotestjsonbuildtext=1.

Новата променлива на средата GOAUTH осигурява гъвкав начин за удостоверяване на частни изтегляния на модули. Подробности могат да се видят в go help goauth.

Командата go build сега инсталира версията на основния модул в компилирания бинарен файл, базиран на тага и/или комита на системата за контрол на версиите. Суфиксът +dirty ще бъде добавен при наличие на незакомитени промени. Можете да използвате флага -buildvcs=false, за да пропуснете информацията за контрола на версиите от бинарника.

Нова настройка GODEBUG toolchaintrace=1 вече може да се използва за проследяване на процеса на избор на тулчейн в командата go.

Cgo

Cgo поддържа нови анотации за C функции за подобряване на производителността на изпълнението. #cgo noescape cFunctionName казва на компилатора, че паметта, предадена на C функцията cFunctionName, не напуска. #cgo nocallback cFunctionName казва на компилатора, че C функцията cFunctionName обратно не извиква никакви Go функции. Обща информация може да се види в документацията на cgo.

Cgo в момента отказва да компилира извиквания на C функции, които имат няколко несъвместими декларации. Например, ако f е деклариран едновременно като void f(int) и void f(double), cgo ще съобщи за грешка, вместо да генерира неправилна последователност от извиквания f(0). Новото в този релиз е подобреното откритие на състоянието на грешка, когато несъвместимите декларации се проявяват в различни файлове. #67699.

Objdump

Инструментът objdump сега поддържа дизасемблиране на 64-битен LoongArch (GOARCH=loong64), RISC-V (GOARCH=riscv64) и S390X (GOARCH=s390x).

Vet

Новият анализатор tests съобщава за разпространени грешки в декларациите за тестове, фаззери, бенчмаркове и примери в тестовите пакети, като неправилно оформени имена, неверни сигнатури или примери, които документират несъществуващи идентификатори. Някои от тези грешки могат да доведат до неуспех на тестовете.

Съществуващият анализатор printf сега съобщава за диагностика на извиквания на формата fmt.Printf(s), където s е низ с неконстантна форма, без други аргументи. Такива извиквания почти винаги са грешка, тъй като стойността на s може да съдържа символ %; вместо това използвайте fmt.Print. 60529. Това проверка има тенденция да открива проблеми в съществуващия код и затова се прилага само когато версията на езика (както е посочено в директивата go файла go.mod или коментарите `//go:build) е поне Go 1.24, за да се избегнат сривове в продължителната интеграция при актуализиране на тулчейн Go 1.24.

Съществуващият анализатор buildtag сега съобщава диагностика, когато има неправилно ограничение на сборката за по-стара версия Go в директивата //go:build. Например, //go:build go1.23.1 се отнася до точков релиз; вместо това използвайте //go:build go1.23. #64127.

Съществуващият анализатор copylock сега съобщава диагностика, когато променливата, обявена в тройния цикъл “for”, като for i := iter(); done(i); i = next(i) { … }, съдържа sync.Locker, като sync.Mutex. Go 1.22 промени поведението на такива цикли, създавайки нова променлива за всяка итерация, копирайки стойностите от предишната итерация; това копиране е несигурно за локовете. #66387.

GOCACHEPROG

Вътрешният бинарен файл cmd/go и механизмът за кеширане на тестове сега могат да бъдат реализирани от дочерни процеси, които реализират JSON протокол между инструмента cmd/go и дочерния процес, наречен променлива на средата GOCACHEPROG. Преди това беше за GOEXPERIMENT. Подробностите за протокола могат да бъдат видяни в документацията.

Време за изпълнение

Няколко подобрения на производителността в рантайм намалиха накладните разходи за CPU средно с 2-3% сред набор от представителни бенчмаркове. Резултатите могат да варират в зависимост от приложението. Тези подобрения включват ново вградена реализация на карта, базирана на Шведски таблици, по-ефективно разпределение на паметта за малки обекти и нова вътрешна реализация на мютекс в рантайма.

Новата вградена реализация на карта и новият вътрешен мютекс в рантайма могат да бъдат изключени с настройките GOEXPERIMENT=noswissmap и GOEXPERIMENT=nospinbitmutex по време на сборка съответно.

Компилатор

Компилаторът вече забранява определянето на нови методи с типове получатели, които са генерирани от cgo, но беше възможно да се заобиколи това ограничение чрез алиас тип. Go 1.24 сега винаги показва грешка, ако получателят обозначава генериран cgo тип, директно или косвено (чрез тип алиас).

Линкер

Линкерът сега генерира идентификатор на сборка GNU (запис ELF NT_GNU_BUILD_ID) на ELF платформи и UUID (команда за зареждане Mach-O LC_UUID) на macOS по подразбиране. Идентификаторът на сборката или UUID се извежда от идентификатора на сборката Go. Това може да бъде изключено с флага на линкера -B none, или заменяно с флага на линкера -B 0xNNNN с посочена от потребителя шестоъгълна стойност.

Разкрутка

Както беше посочено в записките за издаване на Go 1.22, Go 1.24 сега изисква за стартиране Go 1.22.6 или по-късно. Разработчиците очакват, че Go 1.26 ще изисква за стартиране точков релиз на Go 1.24 или по-късно.

Стандартна библиотека

Ограничен достъп до файловата система по директория

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

Функция os.OpenRoot отваря директория и връща os.Root. Методите на os.Root работят в тази директория и не позволяват пътищата да сочат към местоположения извън директорията, включително онези, които следват символични връзки извън нея. Методите на os.Root отразяват повечето операции на файловата система, достъпни в пакета os, включително например, os.Root.Open, os.Root.Create, os.Root.Mkdir и os.Root.Stat.

Нова функция за бенчмарки

Бенчмарковете вече могат да използват по-бърз и по-малко податлив на грешки метод testing.B.Loop за извършване на итерации на бенчмарка, подобно на for b.Loop() { … } вместо типичните циклични структури, включващи b.N, като например for range b.N. Това предлага две значителни предимства:

  • Функцията за бенчмарк се изпълнява точно веднъж за всеки count, по този начин скъпите стъпки за настройка и почистване се изпълняват само веднъж.
  • Параметрите на извикването на функцията и резултатите продължават да съществуват, предотвратявайки компилатора от пълна оптимизация на тялото на цикъла.

Подобрени финализатори

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

Нов пакет weak

Нов пакет weak предоставя слаби указатели.

Слабите указатели са нискоуровен примитив, предоставен за създаване на структури, които ефективно използват памет, като слаби речници за съпоставяне на стойности, речници на канонизация за всичко, което не се покрива от пакета unique, и различни видове кешове. За поддръжка на тези потребителски случаи, настоящият релиз също предоставя runtime.AddCleanup и maphash.Comparable.

Нов пакет crypto/mlkem

Нов пакет crypto/mlkem реализира ML-KEM-768 и ML-KEM-1024.

ML-KEM е пост-квантов механизъм за обмен на ключове, известен преди това като Kyber и специфициран в FIPS 203.

Новите пакети crypto/hkdf, crypto/pbkdf2 и crypto/sha3

Нов пакет crypto/hkdf реализира функцията за извеждане на ключове “Extract-and-Expand” HKDF, основана на HMAC, както е определено в RFC 5869.

Нов пакет crypto/pbkdf2 реализира функцията за извеждане на ключове PBKDF2, основана на паролата, както е определено в RFC 8018.

Нов пакет crypto/sha3 реализира хеш функцията SHA-3 и функции на разширяемо извеждане SHAKE и cSHAKE, както е дефинирано в FIPS 202.

Всички три пакета са базирани на предишни пакети golang.org/x/crypto/....

Комплаенс FIPS 140-3

Този релиз включва нов набор от механизми за осигуряване на комплаенс FIPS 140-3.

Криптографският модул Go е набор от вътрешни пакети на стандартната библиотека, които прозрачно се използват за реализиране на одобрените алгоритми FIPS 140-3. Приложенията не изискват промени, за да използват криптографския модул Go за одобрените алгоритми.

Нова променлива на средата GOFIPS140 може да бъде използвана за избор на версията на криптографския модул Go, която да се използва в компилацията. Новата настройка GODEBUG fips140 може да се използва за включване на режима FIPS 140-3 по време на изпълнение.

Go 1.24 включва криптографския модул Go версия v1.0.0, който в момента се тества с акредитирана лаборатория CMVP.

Нов експериментален пакет testing/synctest

Нов експериментален пакет testing/synctest предоставя поддръжка за тестване на конкурентен код.

  • Функция synctest.Run стартира група от горутини в изолиран «балон». В балона функциите на пакета time работят на фалшиви часовници.
  • Функции synctest.Wait чакат всички горутини да бъдат блокирани в текущия балон.

Подробности могат да се видят в документацията на пакета.

Пакетът synctest е експериментален и трябва да бъде активиран с инсталиране на GOEXPERIMENT=synctest. API на пакета може да се промени в бъдещи релизи. В #67434 може да се видят повече подробности и да се предостави обратна връзка.

Минорни промени в библиотеката

archive

Реализациите (*Writer.AddFS) в archive/zip и archive/tar сега пишат заглавие на директория за празна директория.

bytes

Пакет bytes добавя няколко функции, които работят с итератори:

  • Lines върща итератор по разделените с нов ред редове в слайс от байтове.
  • SplitSeq върща итератор за всички подсекции на байтовия слайс, разделен със сепаратор.
  • SplitAfterSeq върща итератор за подсекциите на байтовия слайс, разделен след всяко появяване на сепаратора.
  • FieldsSeq върща итератор за подсекциите на байтовия слайс около последователностите от символи на пробел, както е определено unicode.IsSpace
  • FieldsFuncSeq върща итератор за подсекциите на байтовия слайс около последователностите от кодови точки на юникода, които удовлетворяват предиката.

crypto/aes

Стойността, която се връща NewChipher повече не реализира методите NewCTR, NewGCM, NewCBCEncrypter и NewCBCDecrypter. Тези методи не бяха документирани и не бяха налични на всички архитектури. Сега стойността Block Трябва да се подава директно на съответните функции crypto/cipher. В момента crypto/cipher все още проверява тези методи за стойностите Block, дори ако те вече не се поддържат от стандартната библиотека.

crypto/cipher

Нова функция NewGCMWithRandomNonce върща AEAD, който реализира AES-GCM, генерирайки случаен еднократен номер по време на Seal и добавяйки го в началото на криптирания текст.

Реализация Stream, върнат NewCTR при използването му с crypto/aes сега е многократно по-бърз на amd64 и arm64.

NewOFB, NewCFBEncrypter и NewCFBDecrypter сега са обявени за остарели. Режимите OFB и CFB не са аутентифицирани, което позволява активно атака да манипулира и възстановява открития текст. Приложенията се препоръчват да използват AEAD вместо това. Ако неаутентифицираният режим Stream е необходим, може да се използва NewCTR вместо.

crypto/ecdsa

PrivateKey.Sign сега генерира детерминирана подписка в съответствие с RFC 6979, ако източникът на случайност е nil.

crypto/md5

Стойността, която се връща md5.New, сега също реализира интерфейса encoding.BinaryAppender.

crypto/rand

Функция Read сега гарантира отсъствие на неуспехи. Ако Read срещне грешка по време на четене Reader, програмата ще приключи безвъзвратно. Обърнете внимание, че стандартният Reader е документиран да работи успешно, така че това изменение трябва да засегне само програмите, които пренаписват променливата Reader. Едно изключение са ядрото на Linux до версия 3.17, където стандартният Reader все още отваря /dev/urandom и може да претърпи неуспех.

На Linux 6.11 и по-късно Reader сега използва системния повик getrandom чрез vDSO. Това е многократно по-бързо, обикновено за малки четения.

На OpenBSD Reader сега използва arc4random_buf(3).

Нова функция Text сега може да генерира криптографски сигурни произволни текстови низи.

crypto/rsa

GenerateKey сега връща грешка, ако е поискан ключ с дължина по-малко от 1024 бита. Всички методи Sign, Verify, Encrypt и Decrypt сега връщат грешка, ако се използват с ключ с размер по-малко от 1024 бита. Такива ключове не са сигурни и не трябва да се използват. Настройка на GODEBUG rsa1024min=0 възстановява старото поведение, но разработчиците на Go препоръчват да се прави това само при необходимост и само в тестове, например добавяйки реда //go:debug rsa1024min=0 в тестовия файл. Нов пример GenerateKey предоставя лесен за използване стандартен тестов ключ с 2024 бита.

Сега е безопасно и по-ефективно да се извиква PrivateKey.Precompute до PrivateKey.Validate. Precompute сега е по-бързо в присъствието на частично запълнено PrecomputedValues, например при извличане на ключ от JSON.

Пакетът сега отхвърля повече неправилни ключове, дори когато Validate не се извиква, и GenerateKey сега може да върне нови грешки за повредени източници на случайност. Полетата Primes и Precomputed структури PrivateKey сега се използват и валидират дори когато някои стойности липсват. Освен това са направени промени в crypto/x509 по парсинга и извличането на RSA ключове, описани по-долу.

SignPKCS1v15 и VerifyPKCS1v15 сега поддържат SHA-512/224, SHA-512/256 и SHA-3.

GenerateKey сега използва малко по-различен метод за генериране на частния експонент (функция на Кармайкъл вместо функция на Ойлер). Редките приложения, които пресъздават ключовете само от простите числа, могат да предизвикат различни, но съвместими резултати.

Операциите с публични и частни ключове сега са до два пъти по-бързи на wasm.

crypto/sha*

crypto/subtle

Нова функция WithDataIndependentTiming позволява на потребителя да изпълнява функция с включени специфични за архитектурата функции, които гарантират неизменността на определени инструкции относно времето на стойностите на данните. Това може да бъде използвано, за да се уверите, че кодът, създаден да работи за константно време, не е оптимизиран от функции на ниво процесор по начин, който би го накарал да работи с променливо време. В момента WithDataIndependentTiming използва бит PSTATE.DIT на arm64 и нищо не прави на всички останали архитектури. Настройка на GODEBUG dataindependenttiming=1 активира режима DIT за цялата програма Go.

Извод XORBytes трябва да се припокрива напълно или изобщо с входа. Предишното поведение беше неопределено в противен случай, докато сега XORBytes ще паникьосва.

crypto/tls

Серверът TLS вече поддържа Encrypted Client Hello (ECH). Тази възможност може да бъде активирана, като се запълни полето Config.EncryptedClientHelloKeys.

Нов пост-квантов механизъм за обмен на ключове X25519MLKEM768 вече се поддържа и е включен по подразбиране, когато Config.CurvePreferences е nil. Настройка на GODEBUG tlsmlkem=0 връща по подразбиране.

Поддръжката на експерименталния механизъм за обмен на ключове X25519Kyber768Draft00 беше премахната.

Порядъкът на обмена на ключове сега се обработва напълно от пакета crypto/tls. Порядъкът Config.CurvePreferences сега се игнорира, а съдържанието се използва само за определяне на това, кои обменни механизми за ключове да се включат, когато полето е запълнено.

Новото поле ClientHelloInfo.Extensions перечислява списък с идентификатори на разширения, получени в съобщението Client Hello. Това може да бъде полезно за генериране на отпечатъци на TLS клиенти.

crypto/x509

Настройка на GODEBUG x509sha1 беше премахната. Certficicate.Verify вече не поддържа подписи, основани на SHA-1.

OID сега реализира интерфейсите encoding.BinaryAppender и encoding.TextAppender.

По подразбиране полето за сертификатните политики беше променено с Certificate.PolicyIdentifiers на Certificate.Policies. При анализа на сертификатите и двете полета ще бъдат запълнени, но при създаването на политиките за сертификати ще бъдат взети от полето Certificate.Policies вместо Certificate.PolicyIdentifiers. Тази промяна може да бъде върната чрез настройката GODEBUG x509usepolicies=0.

CreateCertificate сега ще генерира сериен номер, използвайки метод, съвместим с RFC 5280, при предаване на шаблона чрез полето Certificate.SerialNumber nil, вместо да се проваля.

Certificate.Verify сега поддържа валидиране на политика, както е определено в RFC 5280 и RFC 9618. Новото поле VerifyOptions.CertificatePolicies може да бъде зададено на приемлив набор от политики OIDs. Само веригите на сертификатите с валидни графи на политиките ще бъдат върнати от Certificate.Verify.

MarshalPKCS8PrivateKey сега връща грешка вместо да извлече неправилен RSA ключ. (MarshalPKCS1PrivateKey не подава грешка и поведението му с предоставените неправилни ключове остава неопределено.)

ParsePKCS1PrivateKey и ParsePKCS8PrivateKey сега използват и валидират кодираните стойности CRT, така че могат да отхвърлят неверни RSA ключове, които преди това бяха приети. Използването на настройките GODEBUG x509rsacrt=0 възстановява преподчисляването на стойностите CRT.

debug/elf

Пакет debug/elf добавя поддръжка за обработка на версии на символи в динамичните ELF файлове (Executable and Linkable Format). Нов метод File.DynamicVersions върща списък с динамични версии, определени в ELF файла. Нов метод File.DynamicVersionNeeds върща списък на динамични версии, изисквани от този ELF файл, които са дефинирани в други ELF обекти. Накрая, новите полета Symbol.HasVersion и Symbol.VersionIndex показват версията на символа.

encoding

Два нови интерфейса TextAppender и BinaryAppender бяха въведени за добавяне на текстово или бинарно представяне на обекта към slice. Тези интерфейси предоставят подобна функционалност на TextMarshaler и BinaryMarshaler, но вместо да отделят нов slice всеки път, те добавят данни директно в съществуващия slice. Тези интерфейси в момента са реализирани от типовете на стандартната библиотека, които вече реализират TextMarshaler и/или BinaryMarshaler.

encoding/json

При изграждането на структурата, полето с новата опция omitzero в етикета на полето ще бъде пропуснато, ако стойността му е нула. Ако типът на полето има метод IsZero() bool, той ще бъде използван за определяне дали стойността е нула. В противен случай стойността ще бъде нулева, ако е нулева стойност за своя тип. Етикетът на полето omitzero е по-чист и по-малко податлив на грешки от omitempty, когато намерението е да се пропуснат нулеви стойности. По-специално, за разлика от omitempty, omitzero пропуска нулевите time.Time стойности, което е често срещан източник на проблеми.

Ако и omitempty, и omitzero са указани, полето ще бъде пропуснато, ако стойността е празна или нулева (или двете наведнъж).

UnmarshalTypeError.Field сега включва вградени структури за предоставяне на по-подробни съобщения за грешки.

go/types

Всички структури от данни go/types, които разкриват последователности от два метода, като Len() int и At(int) T, сега разполагат и с методи, които връщат итератори, позволяващи опростяване на код, подобен на този:

params := fn.Type.(*types.Signature).Params() for i := 0; i < params.Len(); i++ { use(params.At(i)) }

На този:

for param := range fn.Signature().Params().Variables() { use(param) }

Методи: Interface.EmbeddedTypes Interface.ExplicitMethods Interface.Methods MethodSet.Methods Named.Methods Scope.Children Struct.Fields Tuple.Variables TypeList.Types TypeParamList.TypeParams Union.Terms

hash/*

log/slog

Нов DiscardHandler е обработчик, който никога не е включен и винаги отхвърля своя изход.

Level и LevelVar вече реализират интерфейса encoding.TextAppender.

math/*

net

ListenCondig вече използва MPTCP по подразбиране на системи, където това е поддържано (засега само Linux).

IP вече реализира интерфейса encoding.TextAppender.

net/http

Промени ограничението Transport на получените информационни отговори 1xx в отговор на заявка. По-рано това спираше заявката и връщаше грешка след получаване на повече от 5 отговора 1xx. Сега това връща грешка само ако общият размер на всички отговори 1xx надвишава настройката на конфигурацията Transport.MaxResponseHeaderBytes.

Освен това, когато заявката има хук за проследяване net/http/httptrace.ClientTrace.Got1xxResponse, сега няма ограничение на общия брой отговори 1xx. Хук Got1xxResponse може да върне грешка за спиране на заявката.

Transport и Сървър вече имат поле HTTP2, което позволява конфигуриране на настройки за протокола HTTP/2.

Нови полета Server.Protocols и Transport.Protocols предоставят прост начин за конфигуриране на какви протоколи HTTP сървърът или клиентът използват.

Сървърът и клиентът могат да бъдат конфигурирани да поддържат нешифровани връзки HTTP/2.

Когато Server.Protocols съдържа UnencrypterHTTP2, сървърът ще приеме връзки HTTP/2 на нешифровани портове. Сървърът може да приеме едновременно HTTP/1 и нешифрован HTTP/2 на един и същ порт.

Когато Transport.Protocols съдържа UnencryptedHTTP2 и не съдържа HTTP1, транспортът ще използва нешифрован HTTP/2 за адреси http://. Ако транспортът е конфигуриран да използва едновременно HTTP/1 и нешифрован HTTP/2, той ще използва HTTP/1.

Поддръжката на нешифрован HTTP/2 използва "HTTP/2 с предварително познание" (RFC 9113, секция 3.3). Устарелият заглавие "Upgrade: h2c" не се поддържа.

net/netip

Addr, AddrPort и Prefix сега реализират интерфейси encoding.BinaryAppender и encoding.TextAppender.

net/url

URL сега също реализира интерфейса encoding.BinaryAppender.

os/user

В Windows Current сега може да се използва в Windows Nano Server. Реализацията бе актуализирана, за да се избегне използването на функции от библиотеката NetApi32, която липсва в Nano Server.

В Windows Current, Lookup и LookupId сега поддържат следните вградени потребителски акаунти:

  • NT AUTHORITYSYSTEM
  • NT AUTHORITYLOCAL SERVICE
  • NT AUTHORITYNETWORK SERVICE

В Windows Current беше значително ускорен, когато текущият потребител е свързан с бавен домейн, което е често срещано при много корпоративни потребители. Новата производителност на реализацията е с порядък на милисекундите, в сравнение с предишната реализация, която може да отнеме няколко секунди, дори минути, за завършване.

В Windows Current сега връща потребителя собственик на процеса, когато текущият поток представя себе си като друг потребител. Поради това преди това връщаше грешка.

regexp

Regexp вече реализира интерфейса encoding.TextAdapter.

runtime

Функция GOROOT сега е декларирана за остаряла. В новия код следва да се предпочита използването на системния път за определяне на бинарника "go", и да се използва go env GOROOT за определяне на GOROOT.

strings

Пакет strings добавя няколко функции за работа с итератори:

  • Lines възвраща итератор по редове, разделени с нова линия в низа.
  • SplitSeq възвраща итератор по всички поднизове на низа, разделени с разделител.
  • SplitAfterSeq възвраща итератор по поднизове на низа, разделени след всяко появяване на разделителя.
  • FieldsSeq възвраща итератор по поднизове на низа около последователности от символи пространство, както е определеноunicode.IsSpace
  • FieldsFuncSeq възвраща итератор по поднизове на низа около последователности от кодови точки на Юникод, които удовлетворяват предиката.

sync

Реализация sync.Map бе променена, за да се подобри производителността, особено за изменения на речниците. Например, по-малко е вероятно да се конкурират изменения на непересекащи се множества в големи речници, а вече не се изисква време за нарастване, за да се постигне от речник с ниска конкуренция.

Ако срещнете някакви проблеми, задайте GOEXPERIMENT=nosynchashtriemap по време на компилацията, за да се върнете към старата реализация и, моля, попълнете формуляра за проблеми.

тест

Новите методи T.Context и B.Context върщат контекст, който се отменя след завършването на теста и преди изпълнението на функциите за почистване на теста.

Новите методи T.Chdir и B.Chdir могат да се използват за промяна на работната директория за периода на изпълнение на теста или бенчмарка.

text/template

Шаблоните вече поддържат range-over-func и range-over-int.

time

Време сега реализира интерфейсите encoding.BinaryAppender и encoding.TextAppender.

Портове

Linux

Както беше обявено в забележките за изданието Go 1.23, Go 1.24 изисква ядро на Linux версия 3.2 или по-ново.

Darwin

Go 1.24 е последното издание, което ще работи на macOS 11 Big Sur. Go 1.25 ще изисква macOS 12 Monterey или по-ново.

WebAssembly

Директивата на компилатора go:wasmexport е добавена в програмите на Go, за да се експортират функции в хост на WebAssembly.

В WebAssembly System Interface Preview 1 (GOOS=wasip1 GOARCH=wasm) Go 1.24 поддържа компилация на програма Go като reactor/library чрез указване на флага за компилация -buildmode=c-shared.

Повече типове вече са разрешени като тип аргумент или резултат за функциите go:wasmimport. По-специално, bool, string, uintptr и указатели към определени типове са разрешени (подробности можете да видите в документацията), заедно с 32-битови и 64-битови типове цели числа и с плаваща точка, и unsafe.Pointer, които вече са разрешени. Тези типове също са разрешени като типове аргумент или резултат за функциите go:wasmexport.

Файловете за поддръжка на WebAssembly бяха преместени в lib/wasm от misc/wasm.

Първоначалният размер на паметта е значително намален, особено за малки приложения WebAssembly.

Windows

32-битовият порт windows/arm (GOOS=windows GOARCH=arm) е обозначен като повреден. Подробности в #70705

Източник: linux.org.ru

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster