перайсці 1.24

перайсці 1.24

Новы выпуск мовы Go, версія 1.24, выходзіць праз шэсць месяцаў пасля перайсці 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 на дадзены момант адмаўляецца кампіляваць выклікі З функцыі, якая мае некалькі несумяшчальных аб'яваў. Напрыклад, калі f абвешчаны як адначасова void f(int) і void f(double), cgo паведаміць памылку замест магчымай генерацыі няправільнай паслядоўнасці выкліку f(0). Новым у гэтым рэлізе з'яўляецца палепшанае выяўленне гэтай умовы памылкі, калі несумяшчальныя аб'явы выяўляюцца ў розных файлах. #67699.

Objdump

Інструмент objdump зараз падтрымлівае дызасэмбляваньне на 64-бітным LoongArch (GOARCH=loong64), RISC-V (GOARCH=riscv64) і S390X (GOARCH=s390x).

Тлушч

Новы аналізатар 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. перайсці 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 будзе патрабаваць для раскруткі кропкавы рэліз 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() { … } замест тыповых цыклічных структур з удзелам bN накшталт for range bN Гэта прапануе дзве значныя перавагі:

  • Функцыя бенчмарку выконваецца сапраўды адзін раз на кожны -count, такім чынам дарагія крокі ўсталёўкі і ачысткі выконваюцца толькі аднойчы.
  • Параметры выкліку функцыі і вынікі працягваюць жыць, прадухіляючы кампілятар ад поўнай аптымізацыі цела цыклу.

Палепшаныя фіналізатары

Новая функцыя runtime.AddCleanup з'яўляецца механізмам завяршэння, які больш гнуткі, больш эфектыўны і меней схільны памылкам чым runtime.SetFinalizer. AddCleanup прымацоўвае функцыю ачысткі да аб'екта, якая запусціцца як толькі аб'ект стане недаступным. Аднак, у адрозненне ад SetFinalizer, некалькі ачыстак могуць быць прымацаваныя да аднаго аб'екта, ачысткі могуць быць прымацаваныя да ўнутраных паказальнікаў, ачысткі звычайна не выклікаюць уцечкі, калі аб'екты фармуюць цыкл, і ачысткі не адкладаюць вызваленне аб'екта ці аб'ектаў, на якія той паказвае. Новы код павінен аддаваць перавагу AddCleanup перад SetFinalizer.

Новы пакет weak

Новы пакет слабы дае слабыя паказальнікі.

Слабыя паказальнікі з'яўляюцца нізкаўзроўневым прымітывам, які прадстаўляецца для стварэння структур, эфектыўна выкарыстоўвалых памяць, такіх як слабыя слоўнікі для супастаўлення значэнняў, слоўнікаў кананізацыі для чаго заўгодна, што не пакрыта пакетам унікальны, і розных відаў кэшаў. Для падтрымкі гэтых юзкейсаў, дадзены рэліз таксама дае 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 запускае групу гаруцін у ізаляванай «бурбалцы». У бурбалцы функцыі пакета час аперуюць на ілжывым гадзінніку.
  • функцыі synctest.Wait чакаюць калі ўсе гаруціны заблакуюцца ў бягучай бурбалцы.

Падрабязнасці можна ўбачыць у дакументацыі пакета.

Пакет synctest з'яўляецца эксперыментальным і павінен быць уключаны ўсталёўкай GOEXPERIMENT=synctest. API пакет можа змяніцца ў будучых рэлізах. У #67434 можна ўбачыць больш падрабязнасцяў і падаць зваротную сувязь.

Мінорныя змены ў бібліятэцы

архіў

Рэалізацыі (*Writer.AddFS) у archive/zip і archive/tar зараз пішуць загаловак дырэкторыі для пустой дырэкторыі.

байт

Пакет байт дадае некалькі функцый, якія працуюць з ітэратарамі:

  • Лініі вяртае ітэратар па падзеленых новай лініяй радках у слайсе байтаў.
  • SplitSeq вяртае ітэратар па ўсіх падслайс слайса байтаў, падзеленага сепаратарам.
  • SplitAfterSeq вяртае ітэратар па падслайс слайса байтаў, падзеленага пасля кожнага ўваходжання сепаратара.
  • FieldsSeq вяртае ітэратар па падслайс слайса байтаў вакол паслядоўнасцяў знакаў прабелу, як вызначана unicode.IsSpace
  • FieldsFuncSeq вяртае ітэратар па падслайс слайса байтаў вакол паслядоўнасцяў кодавых кропак юнікод, якія задавальняюць прэдыкату.

crypto/aes

Значэнне, якое вяртаецца NewChipher больш не рэалізуе метады NewCTR, NewGCM, NewCBCEncrypter і NewCBCDecrypter. Гэтыя метады былі незадакументаваны і не былі даступныя на ўсіх архітэктурах. Цяпер значэнне Блакаваць павінна перадавацца напрамую ў адпаведныя функцыі crypto/cipher. На дадзены момант crypto/cipher усё яшчэ правярае гэтыя метады на значэннях Block, нават калі яны больш не падтрымліваюцца стандартнай бібліятэкай.

crypto/cipher

Новая функцыя NewGCMWithRandomNonce вяртае AEAD, які рэалізуе AES-GCM, генеруючы выпадковы аднаразовы нумар падчас Seal і дадаючы яго ў пачатак зашыфраванага тэксту.

Рэалізацыя Паток, якая вяртаецца NewCTR пры выкарыстанні з crypto/aes зараз у некалькі разоў хутчэй на amd64 і arm64.

NewOFB, NewCFBEncrypter и NewCFBDecrypter зараз абвешчаныя састарэлымі. Рэжымы OFB і CFB неаўтэнтыфікаваны, што ў агульным выпадку дазваляе актыўным нападам маніпуляваць і аднаўляць адчынены тэкст. Прыкладанням рэкамендуецца выкарыстоўваць AEAD наўзамен. Калі неаўтэнтыфікаваны рэжым Паток неабходны, можна выкарыстоўваць NewCTR наўзамен.

crypto/ecdsa

PrivateKey.Sign зараз стварае дэтэрміністычную сігнатуру ў адпаведнасці з RFC 6979, калі крыніца выпадковасці nil.

crypto/md5

Значэнне, якое вяртаецца md5.New, зараз таксама рэалізуе інтэрфейс encoding.BinaryAppender.

crypto/rand

Функцыя Чытаць зараз гарантуе адсутнасць няўдач. Калі Read сустрэне памылку падчас чытання Чытач, праграма незваротна завершыць працу. Звярніце ўвагу, што умолчальный Reader задакументаваны заўсёды працаваць паспяхова, таму гэтая змена павінна закрануць толькі тыя праграмы, якія перавызначаюць зменную Reader. Адным выключэннем з'яўляюцца ядры Linux да версіі 3.17, дзе умолчальный Reader усё яшчэ адчыняе /dev/urandom і можа патрываць няўдачу.

На Linux 6.11 і пазней Reader зараз выкарыстоўвае сістэмны выклік getrandom праз vDSO. Гэта ў некалькі разоў хутчэй, звычайна для невялікіх чытанняў.

На OpenBSD Reader зараз выкарыстоўвае arc4random_buf(3).

Новая функцыя Тэкст зараз можа генераваць крыптаграфічна бяспечныя выпадковыя радкі тэксту.

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 зараз можа вярнуць новыя памылкі для зламаных крыніц выпадковасці. Палі Простыя и Precomputed структуры Закрыты ключ зараз выкарыстоўваюцца і валідуюцца нават калі некаторыя значэнні адсутнічаюць. Таксама ўнесены змены ў 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 паказваюць версію знака.

кадаваньне

Два новыя інтэрфейсы 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/*

log/slog

Новы DiscardHandler з'яўляецца апрацоўшчыкам, які ніколі не ўключаны і заўсёды адкідае сваю выснову.

Niveau и LevelVar зараз рэалізуюць інтэрфейс encoding.TextAppender.

math/*

сетка

ListenCondig зараз выкарыстоўвае MPTCP па змаўчанні на сістэмах, дзе гэта падтрымліваецца (пакуль толькі Linux).

IP зараз рэалізуе інтэрфейс encoding.TextAppender.

net/http

Змянілася абмежаванне транспарт на атрыманыя інфармацыйныя адказы 1xx у адказ на запыт. Раней гэта спыняла запыт і вяртала памылку пасля атрымання больш за 5 адказаў 1xx. Цяпер гэта вяртае памылку толькі калі ўвесь памер усіх адказаў 1xx перавышае настройку канфігурацыі. Transport.MaxResponseHeaderBytes.

Акрамя таго, калі запыт мае хук для адсочвання net/http/httptrace.ClientTrace.Got1xxResponse, Цяпер няма абмежавання на агульную колькасць адказаў 1xx. Хук Got1xxResponse можа вярнуць памылку для спынення запыту.

транспарт и сервер зараз маюць поле 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 и Прэфікс зараз рэалізуюць інтэрфейсы encoding.BinaryAppender и encoding.TextAppender.

net/url

URL зараз таксама рэалізуе інтэрфейс encoding.BinaryAppender.

os/user

У Windows Бягучы зараз можа быць выкарыстаны ў Windows Nano Server. Рэалізацыя была абнаўлення для пазбягання выкарыстання функцый з бібліятэкі NetApi32, якая адсутнічае ў Nano Server.

У Windows Бягучы, Пошук и LookupId зараз падтрымліваюць наступныя ўбудаваныя сэрвісныя акаўнты карыстальніка:

  • СІСТЭМА АЎТАРЫТЫ NT
  • NT AUTHORITYLOCAL SERVICE
  • NT AUTHORITYNETWORK SERVICE

У Windows Бягучы быў значна паскораны, калі бягучы карыстач далучаны да павольнага дамена, што з'яўляецца звычайным выпадкам для шматлікіх карпаратыўных карыстачоў. Новая прадукцыйнасць рэалізацыі зараз у парадку мілісекунд, у параўнанні з папярэдняй рэалізацыі, якая магла заняць некалькі секунд, нават хвілін, да завяршэння.

У Windows Бягучы зараз вяртае карыстальніка ўладальніка працэсу, калі бягучы паток выдае сябе за іншага карыстальніка. Раней гэта вяртала памылку.

рэгулярны выраз

Рэгулярны выраз зараз рэалізуе інтэрфейс encoding.TextAdapter.

час выканання

Функцыя ГАРУТ зараз абвешчана састарэлай. У новым калі варта ўпадабаць выкарыстанне сістэмнага шляху для вызначэння бінарніка "go", і выкарыстоўваць go env GOROOT для вызначэння GOROOT.

радкі

Пакет радкі дадае некалькі функцый для працы з ітэратарамі:

  • Лініі вяртае ітэратар па падзеленых новай лініяй радках у радку.
  • SplitSeq вяртае ітэратар па ўсіх падрадкоў радка, падзеленага сепаратарам.
  • SplitAfterSeq вяртае ітэратар па падрадках радка, падзеленага пасля кожнага ўваходжання сепаратара.
  • FieldsSeq вяртае ітэратар па падрадках радка вакол паслядоўнасцяў знакаў прабелу, як вызначанаunicode.IsSpace
  • FieldsFuncSeq вяртае ітэратар па падрадках радка вакол паслядоўнасцяў кодавых кропак юнікод, якія задавальняюць прэдыкату.

сінхранізаваць

Рэалізацыя sync.Map была зменена, паляпшаючы прадукцыйнасць, у асаблівасці для змен слоўніка. Напрыклад, менш верагодна суперніцтва змен неперасякальных мностваў на вялікіх слоўніках, і больш не патрабуецца час нарошчвання для дасягнення ад слоўніка нагрузкі нізкага суперніцтва.

Калі вы сустрэнеце якія-небудзь праблемы, усталюйце GOEXPERIMENT=nosynchashtriemap падчас зборкі, каб вярнуцца назад да старой рэалізацыі і, калі ласка, запоўніце форму праблемы.

тэставанне

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

Новыя метады T.Chdir и B.Chdir могуць быць выкарыстаны для змены працоўны дырэкторыі на перыяд працы тэсту або бенчмарку.

text/template

Шаблоны зараз падтрымліваюць range-over-func і range-over-int.

час

час зараз рэалізуе інтэрфейсы encoding.BinaryAppender и encoding.TextAppender.

парты

Linux

як было аб'яўлена у нататках рэлізу Go 1.23, Go 1.24 патрабуе ядро ​​Linux версіі 3.2 ці пазней.

Дарвін

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