Новото издание на езика 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% средно върху набор от представителни бенчмаркове. Резултатите могат да варират в зависимост от приложението. Тези подобрения включват нова вградена реализация на map, базирана на Шведски Таблици, по-ефективно выделение на памет за малки обекти и нова вътрешна реализация на мютекса в рантайма.
Новата вградена реализация на map и новият вътрешен мютекс на рантайма могат да бъдат изключени с настройките 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 да изисква точковo издание на 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 реализира основана на HMAC функция за извеждане на ключ ‘Extract-and-Expand’ HKDF, дефинирана в 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 възвръща итератор по подслайсове на байтовия слайс около последователности от unicode кодови точки, удовлетворяващи предиката.
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 срещне грешка по време на четенето 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/sha1: стойността, връщана от sha1.New сега също реализира интерфейса encoding.BinaryAppender.
- crypto/sha256: стойностите, връщани от sha256.New и sha256.New224 сега също реализират интерфейса encoding.BinaryAppender.
- crypto/sha512: стойностите, връщани от sha512.New, sha512.New384, sha512.New512_224 и sha512.New512_256, сега също реализират интерфейса encoding.BinaryAppender.
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 бяха въведени, за да добавят текстово или бинарно представяне на обект към байтов масив. Тези интерфейси предоставят същата функционалност, която имат TextMarshaler и BinaryMarshaler, но вместо да выделят нова масив всеки път, те добавят данните директно в съществуващия масив. Тези интерфейси вече са реализирани от типовете на стандартната библиотека, които вече имплементират 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/*
- hash/adler32: стойността, връщана от Нов, сега също реализира интерфейса encoding.BinaryAppender
- hash/crc32: стойностите, връщани от Нов и NewIEEE, сега също реализират интерфейса encoding.BinaryAppender
- hash/crc64: стойността, връщана от Нов, сега също реализира интерфейса encoding.BinaryAppender
- hash/fnv: стойностите, връщани от New32 New32a New64 New64a New128 и New128a, сега също реализират интерфейса encoding.BinaryAppender
- hash/maphash: нови функции Comparable и WriteComparable могат да изчисляват хеш на всяка стойност, която може да бъде сравнена. Това позволява хеширане на всичко, което може да се използва като ключ на речник в Go.
log/slog
Нов DiscardHandler е обработчик, който никога не е активен и винаги отхвърля изхода си.
Ниво и LevelVar сега реализира интерфейса encoding.TextAppender.
math/*
- math/big: Float, Int и Rat сега реализира интерфейса encoding.TextAppender.
- math/rand: повиквания на остарялата високонадеждна функция Seed вече нямат никакъв ефект. За възстановяване на старото поведение може да се използва настройката GODEBUG randseednop=0. Повече контекст в предложение 67273.
- math/rand/v2: ChaCha8 и PCG сега реализира интерфейса encoding.BinaryAppender.
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
