Go 1.24

Go 1.24

Nová verzia programovacieho jazyka Go, verzia 1.24, vychádza po šiestich mesiacoch od Go 1.23. Väčšina zmien sa týka implementácie nástrojových reťazcov, runtime a knižníc. Ako vždy, vydanie zabezpečuje sľub kompatibility Go 1. Vývojári jazyka očakávajú, že takmer všetky programy Go budú naďalej kompilovať a fungovať ako predtým.

Zmeny v jazyku

Go 1.24 teraz plne podporuje generické aliasy typov: alias typu môže byť parametizovaný ako deklarovaný typ. Podrobnosti nájdete v špecifikácii jazyka. Zatiaľ je možné túto funkciu vypnúť pomocou nastavenia GOEXPERIMENT=noaliastypeparams; avšak možnosť aliastypeparams bude odstránená v Go 1.25.

Nástroje

Príkaz go

Moduly go teraz môžu sledovať vykonávacie závislosti pomocou direktívy tool v go.mod. To odstraňuje potrebu predchádzajúceho obchádzajúceho riešenia pridávania nástrojov ako prázdnych importov do súboru, ktorý sa zvyčajne nazýva „tools.go“. Príkaz go tool teraz môže spúšťať tieto nástroje mimo nástrojov dodávaných spolu s Go. Viac informácií nájdete v dokumenácie.

Nový príkaz -tool pre go get vedie k pridaniu direktívy nástroja do aktuálneho modulu pre určené balíky, okrem pridania direktív požiadaviek.

Nový meta-vzor tool sa vzťahuje na všetky nástroje v aktuálnom module. Môže byť použitý na aktualizáciu všetkých prostredníctvom go get tool alebo na ich inštaláciu do vašej adresáre GOBIN prostredníctvom go install tool.

Vykonávacie súbory vytvorené pomocou go run a nové správanie príkazu go tool sú teraz cachované v cache zostavenia Go. To robí opakované spúšťania rýchlejšími vďaka zvýšenej cache. #69290.

Príkazy go build a go install teraz prijímajú flag -json, ktorý informuje o výstupe a chybách zostavenia ako štruktúrovaný JSON výstup do štandardného výstupu. Detaily formátu nájdete v go help buildjson.

Navyše, go test -json teraz informuje o výstupe a chybách zostavenia v JSON, zmiešané s JSONom výsledku testovania. Tieto je možné rozlíšiť podľa nových typov akcií, ale ak spôsobujú problémy v teste integračného systému, môžete sa vrátiť k textovému výstupu zostavenia cez nastavenie GODEBUG gotestjsonbuildtext=1.

Nová premenná prostredia GOAUTH poskytuje flexibilný spôsob autorizácie súkromných stiahnutí modulov. Podrobnosti nájdete v go help goauth.

Príkaz go build teraz inštaluje verziu hlavného modulu v skompilovanom binárnom súbore, na základe tagu a/alebo commitu systému kontroly verzií. Prípona +dirty sa pridá, ak sú prítomné nezakompilované zmeny. Môžete použiť prepínač -buildvcs=false na to, aby ste vynechali informácie o kontrole verzií z binárneho súboru.

Nová nastavenie GODEBUG toolchaintrace=1 teraz môže byť použitá na sledovanie procesu výberu toolchainu v príkaze go.

Cgo

Cgo podporuje nové anotácie pre funkcie C na zlepšenie výkonu za behu. #cgo noescape cFunctionName hovorí kompilátoru, že pamäť odovzdaná do funkcie C cFunctionName neuniká. #cgo nocallback cFunctionName hovorí kompilátoru, že funkcia C cFunctionName nevyvoláva späť žiadne funkcie Go. Viac informácií nájdete v dokumentácii cgo.

Cgo v súčasnosti odmieta kompilovať volania funkcie C, ktorá má viacero nekompatibilných deklarácií. Napríklad, ak je f vyhlásená ako void f(int) a void f(double), Cgo oznámi chybu namiesto toho, aby generoval nesprávnu sekvenciu volania f(0). Novinkou v tejto verzii je zlepšené rozpoznávanie tejto chybovej podmienky, keď sa nekompatibilné deklarácie objavia v rôznych súboroch. #67699.

Objdump

Nástroj objdump teraz podporuje disassemblovanie na 64-bitovom LoongArch (GOARCH=loong64), RISC-V (GOARCH=riscv64) a S390X (GOARCH=s390x).

Vet

Nový analyzátor tests hlási bežné chyby v deklaráciách testov, fuzzerov, benchmarkov a príkladov v testovacích balíkoch, ako sú nesprávne definované názvy, nesprávne podpisy alebo príklady, ktoré dokumentujú neexistujúce identifikátory. Niektoré z týchto chýb môžu viesť k neúspešným testom.

Existujúci analyzátor printf teraz hlási diagnostiku volaní formátu fmt.Printf(s), kde s je reťazec nekonstantného formátu, bez ďalších argumentov. Takéto volania sú takmer vždy chybou, pretože hodnota s môže obsahovať znak %; namiesto toho použite fmt.Print. 60529. Táto kontrola má tendenciu robiť nálezy v existujúcom kóde, a preto sa uplatňuje iba vtedy, keď je verzia jazyka (ako je uvedené direktívou go v súbore go.mod alebo poznámkami `//go:build) aspoň Go 1.24, aby sa predišlo zlyhaniam dlhodobej integrácie pri aktualizácii na toolchain Go 1.24.

Existujúci analyzátor buildtag teraz hlási diagnostiku, keď je prítomná nesprávna obmedzenie zostavenia novšej verzie Go v direktíve //go:build. Napríklad, //go:build go1.23.1 odkazuje na bodový release; namiesto toho použite //go:build go1.23. #64127.

Existujúci analyzátor copylock teraz hlási diagnostiku, keď premenná deklarovaná v trojitom „for“ cykle, ako for i := iter(); done(i); i = next(i) { … }, obsahuje sync.Locker, ako sync.Mutex. Go 1.22 zmenil správanie takýchto cyklov na vytvorenie novej premennej pre každú iteráciu, kopírovaním hodnôt z predchádzajúcej iterácie; toto kopírovanie nie je bezpečné pre zámky. #66387.

GOCACHEPROG

Interný binárny súbor cmd/go a mechanismus cacheovania testov môžu teraz byť realizované podradenými procesmi, ktoré implementujú protokol JSON medzi nástrojom cmd/go a podradeným procesom, nazývaným premennou prostredia GOCACHEPROG. Predtým to bolo za GOEXPERIMENT. Detaily protokolu si môžete pozrieť v dokumenácie.

Čas vykonávania

Niekoľko vylepšení výkonu v runtime znížilo režijné náklady na CPU v priemere o 2-3% medzi súborom reprezentatívnych benchmarkov. Výsledky sa môžu líšiť v závislosti od aplikácie. Tieto vylepšenia zahŕňajú novú vstavanú implementáciu mapy na základe Švédskych Tabuliek, efektívnejšie prideľovanie pamäte malých objektov a novú internú runtime implementáciu mutexov.

Nová vstavaná implementácia mapy a nová interná runtime mutex môžu byť vypnuté pomocou nastavení GOEXPERIMENT=noswissmap a GOEXPERIMENT=nospinbitmutex počas zostavenia.

Kompilátor

Kompilátor už zakazoval definovať nové metódy s typmi príjemcu, ktoré boli generované cgo, ale bolo možné obísť toto obmedzenie cez alias typu. Go 1.24 teraz vždy hlási chybu, ak príjemca označuje generovaný cgo typ, priamo alebo nepriamo (cez alias typu).

Linker

Linker teraz generuje identifikátor zostavenia GNU (záznam ELF NT_GNU_BUILD_ID) na ELF platformách a UUID (nákladová príkaz Mach-O LC_UUID) na macOS ako predvolené. Identifikátor zostavenia alebo UUID sa odvodzuje z identifikátora zostavenia Go. Toto môže byť vypnuté flagom linkeru -B none, alebo predefinované flagom linkeru -B 0xNNNN s zadanou používateľskou hexadecimálnou hodnotou.

Prechod

Ako bolo uvedené v poznámkach k vydaniu Go 1.22, Go 1.24 teraz vyžaduje Go 1.22.6 alebo novšiu verziu na spustenie. Vývojári očakávajú, že Go 1.26 bude vyžadovať na spustenie bodovú verziu Go 1.24 alebo novšiu.

Štandardná knižnica

Obmedzený prístup k súborovému systému podľa adresára

Nový typ os.Root umožňuje vykonávať operácie so súborovým systémom v rámci konkrétneho adresára.

Funkcia os.OpenRoot otvorí adresár a vráti os.Root. Metódy na os.Root pracujú v tomto adresári a nedovolujú, aby cesty odkazovali na umiestnenia za hranicami adresára, vrátane tých, ktoré nasledujú za symbolickými odkazmi za adresár. Metódy na os.Root odrážajú väčšinu operácií súborového systému dostupných v balíku os, vrátane napríklad os.Root.Open, os.Root.Create, os.Root.Mkdir a os.Root.Stat.

Nová funkcia benchmarku

Benchmarky teraz môžu využívať rýchlejšiu a menej chybovú metódu testing.B.Loop na iteráciu benchmarku, ako for b.Loop() { … } namiesto typických cyklických štruktúr s b.N, ako for range b.N. To ponúka dve významné výhody:

  • Funkcia benchmarku sa vykonáva presne raz na každý -count, takže nákladné kroky nastavenia a čistenia sa vykonajú iba raz.
  • Parametre volania funkcie a výsledky zostávajú, čo bráni kompilátoru v úplnej optimalizácii tela cyklu.

Vylepšené konečnáky

Nová funkcia runtime.AddCleanup je mechanizmus ukončenia, ktorý je flexibilnejší, efektívnejší a menej náchylný na chyby než runtime.SetFinalizer. AddCleanup pripojí funkciu čistenia k objektu, ktorá sa spustí, akonáhle sa objekt stane nedostupným. Avšak, na rozdiel od SetFinalizer, môže byť k jednému objektu pripojených niekoľko čistení, čistenia môžu byť pripojené k vnútorným ukazovateľom, čistenia obvykle nespôsobujú úniky, keď objekty tvoria cyklus, a čistenia neodložia uvoľnenie objektu alebo objektov, na ktoré odkazuje. Nový kód by mal prednostne používať AddCleanup pred SetFinalizer.

Nový balík weak

Nový balík weak poskytuje slabé ukazovatele.

Slabé ukazovatele sú nízkoúrovňový primitív, ktorý je poskytovaný na vytváranie štruktúr, ktoré efektívne využívajú pamäť, ako sú slabé slovníky na mapovanie hodnôt, kanonizačné slovníky pre čokoľvek, čo nie je pokryté balíkom unique, a rôznych typov cache. Na podporu týchto používateľských prípadov, toto vydanie taktiež poskytuje runtime.AddCleanup a maphash.Comparable.

Nový balík crypto/mlkem

Nový balík crypto/mlkem implementuje ML-KEM-768 a ML-KEM-1024.

ML-KEM je postkvantový mechanizmus výmeny kľúčov, známy predtým ako Kyber a špecifikovaný v FIPS 203.

Nové balíky crypto/hkdf, crypto/pbkdf2 a crypto/sha3

Nový balík crypto/hkdf implementuje HMAC založenú funkciu výstupu kľúča “Extract-and-Expand” HKDF, ako je definované v RFC 5869.

Nový balík crypto/pbkdf2 implementuje password-based funkciu výstupu kľúča PBKDF2, ako je definované v RFC 8018.

Nový balík crypto/sha3 implementuje hashovaciu funkciu SHA-3 a SHAKE a cSHAKE funkcie rozšíreného výstupu, ako je definované v FIPS 202.

Všetky tri balíky sú založené na predchádzajúcich balíkoch golang.org/x/crypto/…

Kompliance FIPS 140-3

Toto vydanie obsahuje novú sadu mechanizmov na zabezpečenie kompliance FIPS 140-3.

Kryptografický modul Go je súbor interných balíkov štandardnej knižnice, ktoré sú priehľadne používané na implementáciu schválených algoritmov FIPS 140-3. Aplikácie nevyžadujú zmeny na používanie kryptografického modulu Go pre schválené algoritmy.

Nová premenná prostredia GOFIPS140 môže byť použitá na výber verzie kryptografického modulu Go používaného v zostavení. Nová nastavenie GODEBUG fips140 môže byť použitá na aktiváciu režimu FIPS 140-3 počas vykonávania.

Go 1.24 zahŕňa kryptografický modul Go verzie v1.0.0, ktorý je v súčasnosti testovaný s akreditovanou laboratóriou CMVP.

Nový experimentálny balík testing/synctest

Nový experimentálny balík testing/synctest poskytuje podporu testovania konkurenčného kódu.

  • Funkcia synctest.Run spúšťa skupinu gorútin v izolovanej „buble“. V bubline funkcie balíka time operujú na falošných hodinách.
  • Funkcie synctest.Wait čaká, kým sa všetky gorutiny zablokujú v aktuálnej bubline.

Podrobnosti nájdete v dokumentácii balíka.

Balík synctest je experimentálny a má byť aktivovaný nastavením GOEXPERIMENT=synctest. API balíka sa môže zmeniť v budúcich vydaniach. V #67434 môžete nájsť viac podrobností a poskytnúť spätnú väzbu.

Menšie zmeny v knižnici

archive

Implementácie (*Writer.AddFS) v archive/zip a archive/tar teraz zapisujú hlavičku adresára pre prázdny adresár.

bytes

Balík bytes pridáva niekoľko funkcií, ktoré pracujú s iterátormi:

  • Lines vracia iterátor cez riadky oddelené novou čiarou v bajtovom slice.
  • SplitSeq vracia iterátor pre všetky podsúbory zo slice bajtov, rozdeleného oddeľovačom.
  • SplitAfterSeq vracia iterátor pre podsúbory zo slice bajtov, rozdeleného po každom výskyte oddeľovača.
  • FieldsSeq vracia iterátor pre podsúbory zo slice bajtov okolo sekvencií bielych znakov, ako je definované unicode.IsSpace
  • FieldsFuncSeq vracia iterátor pre podsúbory zo slice bajtov okolo sekvencií kódových bodov unicode, ktoré vyhovujú predikátu.

crypto/aes

Hodnota, ktorá sa vracia NewChipher už viac neimplementuje metódy NewCTR, NewGCM, NewCBCEncrypter a NewCBCDecrypter. Tieto metódy boli nedokumentované a neboli dostupné na všetkých architektúrach. Teraz hodnota Block musí byť priamo odovzdaná do zodpovedajúcich funkcií crypto/cipher. V súčasnosti crypto/cipher stále kontroluje tieto metódy na hodnotách Block, aj keď už nie sú podporované štandardnou knižnicou.

crypto/cipher

Nová funkcia NewGCMWithRandomNonce vracia AEAD, ktorý implementuje AES-GCM, generujúc náhodný jednorazový kód počas Seal a pridáva ho na začiatok zašifrovaného textu.

Implementácia Stream, vracaný NewCTR pri použití s crypto/aes teraz je niekoľkokrát rýchlejší na amd64 a arm64.

NewOFB, NewCFBEncrypter a NewCFBDecrypter sú teraz označené ako zastarané. Režimy OFB a CFB nie sú autentifikované, čo vo všeobecnosti umožňuje aktívnym útokom manipulovať s otvoreným textom a obnoviť ho. Aplikáciám sa odporúča používať AEAD namiesto toho. Ak je neautentifikovaný režim Stream nevyhnutný, je možné použiť NewCTR namiesto.

crypto/ecdsa

PrivateKey.Sign teraz vytvára deterministický podpis v súlade s RFC 6979, ak je zdroj náhody nil.

crypto/md5

Hodnota, ktorá sa vracia md5.New, teraz tiež implementuje rozhranie encoding.BinaryAppender.

crypto/rand

Funkcia Čítať teraz zaručuje neprítomnosť zlyhaní. Ak Read narazí na chybu počas čítania Reader, program nevratne skončí. Všimnite si, že predvolený Reader je zdokumentovaný tak, že vždy funguje úspešne, takže táto zmena by mala zasiahnuť iba tie programy, ktoré predefinujú premennú Reader. Jedinou výnimkou sú jadrá Linuxu pred verziou 3.17, kde predvolený Reader stále otvára /dev/urandom a môže zlyhať.

Na Linuxe 6.11 a neskôr Reader teraz používa systémový volanie getrandom cez vDSO. Je to niekoľkokrát rýchlejšie, zvyčajne pre malé čítania.

Na OpenBSD Reader teraz používa arc4random_buf(3).

Nová funkcia Text teraz môže generovať kryptograficky bezpečné náhodné textové reťazce.

crypto/rsa

GenerateKey teraz vracia chybu, ak je požadovaný kľúč dlhší ako 1024 bitov. Všetky metódy Sign, Verify, Encrypt a Decrypt teraz vracajú chybu, ak sa používajú s kľúčom menším ako 1024 bitov. Takéto kľúče nie sú bezpečné a nemali by sa používať. Nastavenie GODEBUG rsa1024min=0 obnovuje staré správanie, ale vývojári Go odporúčajú robiť to len v prípade potreby a len v testoch, napríklad pridaním riadku //go:debug rsa1024min=0 do testovacieho súboru. Nové príklad GenerateKey poskytuje jednoduchý na použitie štandardný 2024-bitový testovací kľúč.

Teraz je bezpečne a efektívnejšie volať PrivateKey.Precompute do PrivateKey.Validate. Precompute je teraz rýchlejšie v prítomnosti čiastočne vyplnených PrecomputedValues, napríklad pri získavaní kľúča z JSON.

Balík teraz odmieta viac nesprávnych kľúčov, aj keď Validate nie je volaná, a GenerateKey teraz môže vrátiť nové chyby pre neúplné zdroje náhodnosti. Polia Primes a Precomputed struktury PrivateKey teraz sa používajú a overujú aj keď niektoré hodnoty chýbajú. Taktiež boli vykonané zmeny v crypto/x509 pre analýzu a získavanie RSA kľúčov, popísané nižšie.

SignPKCS1v15 a VerifyPKCS1v15 teraz podporujú SHA-512/224, SHA-512/256 a SHA-3.

GenerateKey teraz používa trochu iný spôsob generovania privátneho exponentu (Karmichelova funkcia namiesto Eulerovej). Raré aplikácie, ktoré vonkajšie znovu vytvárajú kľúče iba z prvočísel, môžu vytvoriť rôzne, ale kompatibilné výsledky.

Operácie s verejnými a súkromnými kľúčmi sú teraz až dvakrát rýchlejšie na wasm.

crypto/sha*

crypto/subtle

Nová funkcia WithDataIndependentTiming umožňuje užívateľovi vykonávať funkciu so zapnutými špecifickými pre architektúru, ktorá zaručuje nemennosť určitých inštrukcií vzhľadom na časovú hodnotu dát. Môže to byť použité na overenie, že kód vytvorený na prevádzku v konštantnom čase nebol optimalizovaný procesorovými funkciami tak, že funguje v premennom čase. V súčasnosti WithDataIndependentTiming využíva bit PSTATE.DIT na arm64 a na ostatných architektúrach nevykonáva žiadne operácie. Nastavenie GODEBUG dataindependenttiming=1 zapína režim DIT pre celý program Go.

Záver XORBytes musí sa úplne prekryť alebo vôbec s vstupom. Predtým správanie bolo neurčité v opačnom prípade, zatiaľ čo teraz XORBytes spôsobí paniku.

crypto/tls

Server TLS teraz podporuje Encrypted Client Hello (ECH). Túto funkciu je možné zapnúť vyplnením poľa Config.EncryptedClientHelloKeys.

Nový post-kvantový mechanizmus výmeny kľúčov X25519MLKEM768 je teraz podporovaný a zapnutý predvolene, keď Config.CurvePreferences je nil. Nastavenie GODEBUG tlsmlkem=0 vráti predvolené nastavenie.

Podpora experimentálnej výmeny kľúčov X25519Kyber768Draft00 bola odstránená.

Poradie výmeny kľúčov je teraz spracované plne balíkom crypto/tls. Poradie Config.CurvePreferences je teraz ignorované a obsah sa používa len na určenie, ktoré výmeny kľúčov zahrnúť, keď je pole vyplnené.

Nové pole ClientHelloInfo.Extensions vymenováva zoznam identifikátorov rozšírení prijatých v správe Client Hello. To môže byť užitočné na odtlačky klientov TLS.

crypto/x509

Nastavenie GODEBUG x509sha1 bola odstránená. Certficicate.Verify už nepodporuje podpisy založené na SHA-1.

OID teraz implementuje rozhrania encoding.BinaryAppender a encoding.TextAppender.

Predvolené pole politík certifikátu bolo zmenené z Certificate.PolicyIdentifiers na Certificate.Policies. Pri rozprávaní certifikátov budú oba polia vyplnené, ale pri vytváraní politík certifikátov budú brané z poľa Certificate.Policies namiesto Certificate.PolicyIdentifiers. Táto zmena môže byť vrátená nastavením GODEBUG x509usepolicies=0.

CreateCertificate teraz bude generovať sériové číslo použitím metódy kompatibilnej s RFC 5280 pri prenosu šablóny poľom Certificate.SerialNumber nil, namiesto zlyhania.

Certificate.Verify teraz podporuje overovanie politík, ako je definované v RFC 5280 a RFC 9618. Nové pole VerifyOptions.CertificatePolicies môže byť nastavené na akceptovateľný súbor politík OIDs. Iba reťazce certifikátov s platnými grafmi politík budú vrátené z Certificate.Verify.

MarshalPKCS8PrivateKey teraz vráti chybu namiesto extrakcie nesprávneho RSA kľúča. (MarshalPKCS1PrivateKey nevracia chybu a jeho správanie pri poskytnutých nesprávnych kľúčoch naďalej ostáva neurčité.)

ParsePKCS1PrivateKey a ParsePKCS8PrivateKey teraz používajú a validujú zakódované hodnoty CRT, takže môžu odmietať nesprávne RSA kľúče, ktoré boli predtým akceptované. Používanie nastavenia GODEBUG x509rsacrt=0 sa vracia k prepočítaniu hodnôt CRT.

debug/elf

Balík debug/elf pridáva podporu spracovania verzií symbolov v dynamických súboroch ELF (Executable and Linkable Format). Nová metóda File.DynamicVersions vracia zoznam dynamických verzií definovaných v súbore ELF. Nová metóda File.DynamicVersionNeeds vracia zoznam dynamických verzií, ktoré vyžaduje tento súbor ELF, a ktoré sú definované v iných objektoch ELF. Nakoniec, nové polia Symbol.HasVersion a Symbol.VersionIndex určujú verziu symbolu.

encoding

Dve nové rozhrania TextAppender a BinaryAppender boli zavedené na pridanie textovej alebo binárnej reprezentácie objektu do byte slice. Tieto rozhrania poskytujú rovnakú funkčnosť ako TextMarshaler a BinaryMarshaler, ale namiesto alokácie nového slice každý raz, pridávajú dáta priamo do existujúceho slice. Tieto rozhrania sú teraz implementované typmi štandardnej knižnice, ktoré už implementujú TextMarshaler a/alebo BinaryMarshaler.

encoding/json

Pri zostavovaní poľa štruktúry s novou možnosťou omitzero v tagu poľa štruktúry bude vynechané, ak má hodnotu nula. Ak má typ poľa metódu IsZero() bool, bude použitá na určenie, či je hodnota nulová. Inak bude hodnota nulová, ak je to nulová hodnota pre jeho typ. Tag poľa omitzero je čistejší a menej náchylný na chyby ako omitempty, keď je úmyslom vynechať nulové hodnoty. Konkrétne, na rozdiel od omitempty, omitzero vynecháva nulové time.Time hodnoty, čo je častý zdroj problémov.

Ak sú uvedené oba omitempty a omitzero, pole bude vynechané, ak je hodnota prázdna alebo nulová (alebo oboje naraz).

UnmarshalTypeError.Field teraz zahŕňa zabudované štruktúry na poskytovanie podrobnejších chybových hlásení.

go/types

Všetky dátové štruktúry go/types, ktoré odhaľujú sekvencie párov metód ako Len() int a At(int) T, teraz majú aj metódy, ktoré vracajú iterátory, čo zjednodušuje kód ako tento:

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

Na tomto:

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

Metódy: 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

Nový DiscardHandler je handler, ktorý nikdy nie je zapnutý a vždy odhaduje svoj výstup.

Úroveň a LevelVar teraz implementujú rozhranie encoding.TextAppender.

math/*

net

ListenCondig teraz používa MPTCP ako predvolené na systémoch, kde je to podporované (zatiaľ len Linux).

IP teraz implementuje rozhranie encoding.TextAppender.

net/http

Zmenilo sa obmedzenie Transport na prijaté informačné odpovede 1xx na požiadavku. Predtým to zastavilo požiadavku a vrátilo chybu po prijatí viac ako 5 odpovedí 1xx. Teraz to vráti chybu len ak celková veľkosť všetkých odpovedí 1xx presahuje nastavenie konfigurácie Transport.MaxResponseHeaderBytes.

Okrem toho, keď požiadavka má háčik na sledovanie net/http/httptrace.ClientTrace.Got1xxResponse, teraz nie je obmedzenie na celkový počet odpovedí 1xx. Hák Got1xxResponse môže vrátiť chybu na zastavenie požiadavky.

Transport a Server teraz majú pole HTTP2, ktoré umožňuje konfigurovanie nastavení protokolu HTTP/2.

Nové polia Server.Protocols a Transport.Protocols poskytujú jednoduchý spôsob, ako nakonfigurovať, aké protokoly HTTP server alebo klient používajú.

Server a klient môžu byť nakonfigurovaní na podporu nezašifrovaných pripojení HTTP/2.

Keď Server.Protocols obsahuje UnencrypterHTTP2, server prijme pripojenia HTTP/2 na nezašifrované porty. Server môže prijať súčasne HTTP/1 a nezašifrovaný HTTP/2 na rovnakom porte.

Keď Transport.Protocols obsahuje UnencryptedHTTP2 a neobsahuje HTTP1, transport použije nezašifrovaný HTTP/2 pre adresy http://. Ak je prenos nakonfigurovan na používanie HTTP/1 a nezašifrovaného HTTP/2, použije HTTP/1.

Podpora nezašifrovaného HTTP/2 používa „HTTP/2 s predbežným poznaním“ (RFC 9113, časť 3.3). Zastaralý header „Upgrade: h2c“ nie je podporovaný.

net/netip

Addr, AddrPort a Prefix teraz implementujú rozhrania encoding.BinaryAppender a encoding.TextAppender.

net/url

URL teraz tiež implementuje rozhranie encoding.BinaryAppender.

os/user

Vo Windows Current teraz môže byť použitý vo Windows Nano Server. Implementácia bola aktualizovaná, aby sa predišlo používaniu funkcií z knižnice NetApi32, ktorá nie je prítomná v Nano Server.

Vo Windows Current, Lookup a LookupId teraz podporujú nasledujúce vstavané používateľské servisné účty:

  • NT AUTHORITYSYSTEM
  • NT AUTHORITYLOCAL SERVICE
  • NT AUTHORITYNETWORK SERVICE

Vo Windows Current bol výrazne zrýchlený, keď je aktuálny používateľ pripojený k pomalému doménu, čo je bežný scénar pre mnohých firemných používateľov. Nový výkon implementácie je teraz v ráde milisekúnd, v porovnaní s predchádzajúcou implementáciou, ktorá mohla trvať niekoľko sekúnd, ba dokonca minút, kým sa dokončila.

Vo Windows Current teraz vracia používateľa vlastníka procesu, keď aktuálny vlákno sa vydáva za iného používateľa. Predtým to vracalo chybu.

regexp

Regexp teraz implementuje rozhranie encoding.TextAdapter.

runtime

Funkcia GOROOT teraz je vyhlásená za zastaranú. V novom kóde by sa mala uprednostniť použitie systémovej cesty na určenie binárky „go“ a použiť go env GOROOT na určenie GOROOT.

strings

Balík strings pridáva niekoľko funkcií na prácu s iterátormi:

  • Lines vracia iterátor po riadkoch rozdelených novou líniou v reťazci.
  • SplitSeq vracia iterátor po všetkých podreťazcoch reťazca, rozdelených podľa oddeľovača.
  • SplitAfterSeq vracia iterátor po podreťazcoch reťazca, rozdelených po každom výskyte oddeľovača.
  • FieldsSeq vracia iterátor po podreťazcoch reťazca okolo sekvencií znakov prázdneho miesta, ako je definovanéunicode.IsSpace
  • FieldsFuncSeq vracia iterátor po podreťazcoch reťazca okolo sekvencií kódových bodov unicode, ktoré vyhovujú predikátu.

sync

Implementácia sync.Map bola zmenená na zlepšenie výkonu, najmä pre zmeny slovníka. Napríklad je menej pravdepodobné, že dôjde k súťaženiu zmien neprekrývajúcich sa množín na veľkých slovníkoch, a viac nie je potrebný čas na naťahovanie na dosiahnutie slovníka s nízkou súťažou.

Ak sa stretnete s akýmikoľvek problémami, nastavte GOEXPERIMENT=nosynchashtriemap počas zostavenia, aby ste sa vrátili k starej implementácii a, prosím, vyplňte formulár problémov.

testing

Nové metódy T.Context a B.Context vracajú kontext, ktorý sa zruší po dokončení testu a pred vykonaním funkcií čistenia testu.

Nové metódy T.Chdir a B.Chdir môžu byť použité na zmenu pracovného adresára počas vykonávania testu alebo benchmarku.

text/template

Šablóny teraz podporujú range-over-func a range-over-int.

time

Time teraz implementuje rozhrania encoding.BinaryAppender a encoding.TextAppender.

Ports

Linux

Ako bolo vyhlásené v poznámkach k vydaniu Go 1.23, Go 1.24 vyžaduje jadro Linux verzie 3.2 alebo novšiu.

Darwin

Go 1.24 je posledné vydanie, ktoré bude fungovať na macOS 11 Big Sur. Go 1.25 bude vyžadovať macOS 12 Monterey alebo novšiu.

WebAssembly

Priama direktíva kompilátora go:wasmexport bola pridaná do programov Go na exportovanie funkcií do hostiteľa WebAssembly.

V WebAssembly System Interface Preview 1 (GOOS=wasip1 GOARCH=wasm) Go 1.24 podporuje zostavenie programu Go ako reactor/library prostredníctvom špecifikovania prepínača zostavenia -buildmode=c-shared.

Viac typov je teraz povolených ako typ argumentu alebo výsledku pre funkcie go:wasmimport. Osobitne, bool, string, uintptr a ukazovatele na určité typy sú povolené (podrobnosti nájdete v dokumenácie), spolu s 32-bitovými a 64-bitovými typmi celých čísel a s plávajúcou desatinnou čiarkou, a unsafe.Pointer, ktoré sú už povolené. Tieto typy sú tiež povolené ako typy argumentu alebo výsledku pre funkcie go:wasmexport.

Podporné súbory pre WebAssembly boli presunuté do lib/wasm z misc/wasm.

Počiatočná veľkosť pamäte bola významne znížená, najmä pre malé aplikácie WebAssembly.

Windows

32-bitový port windows/arm (GOOS=windows GOARCH=arm) bol označený ako zlomený. Podrobnosti v #70705

Zdroj: linux.org.ru

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster