Go 1.24

Go 1.24

Noua versiune a limbajului Go, versiunea 1.24, este lansată la șase luni după Go 1.23. Cele mai multe modificări vizează implementarea toolchain-ului, runtime-ului și bibliotecilor. Ca de obicei, lansarea oferă promisiunea de compatibilitate Go 1. Dezvoltatorii limbajului se așteaptă ca aproape toate programele Go să continue să compileze și să funcționeze ca înainte.

Modificări în limbaj

Go 1.24 acum suportă complet aliasuri generice de tipuri: un alias de tip poate fi parametrizat ca un tip declarat. Detalii în specificația limbajului. Deocamdată, această caracteristică poate fi dezactivată prin setarea GOEXPERIMENT=noaliastypeparams; totuși, opțiunea aliastypeparams va fi eliminată în Go 1.25.

Instrumente

Comanda go

Modulele go pot acum să urmărească dependențele executabile folosind directivele tool în go.mod. Aceasta elimină necesitatea unei soluții anterioare de a adăuga uneltele ca importuri goale în fișier, adesea denumit “tools.go”. Comanda go tool poate acum să execute aceste unelte pe lângă uneltele livrate împreună cu Go. Mai multe informații pot fi vizualizate în documentation.

Noua opțiune -tool pentru go get duce la adăugarea unei directive instrument în modul curent pentru pachetele specificate, pe lângă adăugarea directivelor de cerință.

Un nou meta-modelul tool se referă la toate uneltele din modul curent. Acesta poate fi folosit pentru a le actualiza pe toate prin go get tool sau pentru a le instala în directorul GOBIN prin go install tool.

Fișierele executabile create prin go run și noul comportament go tool sunt acum stocate în cache-ul de construcție Go. Aceasta face ca execuțiile repetate să fie mai rapide datorită cache-ului crescut. #69290.

Comenzile go build și go install acceptă acum opțiunea -json, care raportează ieșirea și erorile construcției ca ieșire structurat în JSON în ieșirea standard. Detalii despre format pot fi văzute în go help buildjson.

În plus, go test -json acum raportează ieșirea și erorile construcției în JSON, alături de JSON-ul rezultatului testării. Acestea pot fi distinse prin noile tipuri de Acțiune, dar dacă acestea cauzează probleme în sistemul de integrare a testelor, este posibil să reveniți la ieșirea textului de construcție prin setarea GODEBUG gotestjsonbuildtext=1.

Noua variabilă de mediu GOAUTH oferă o modalitate flexibilă de a autentifica tragerea privată a modulelor. Detalii pot fi văzute în go help goauth.

Comanda go build acum instalează versiunea modulului principal în fișierul binar compilat, bazat pe tag-ul și/sau commit-ul sistemului de control al versiunilor. Sufixul +dirty va fi adăugat în cazul în care există modificări necomise. Poți folosi flag-ul -buildvcs=false pentru a omite informațiile de control al versiunilor din binar.

Nou configurarea GODEBUG toolchaintrace=1 acum poate fi utilizată pentru a urmări procesul de alegere a toolchain-ului în echipa go.

Cgo

Cgo suportă noi adnotări pentru funcțiile C pentru a îmbunătăți performanța la timpul de execuție. #cgo noescape cFunctionName spune compilatorului că memoria trecută la funcția C cFunctionName nu este eliberată. #cgo nocallback cFunctionName spune compilatorului că funcția C cFunctionName nu apelează înapoi nicio funcție Go. Mai multe informații pot fi găsite în documentația cgo.

Cgo refuză acum compilarea apelurilor funcțiilor C care au declarații incompatibile. De exemplu, dacă f este declarat atât void f(int) cât și void f(double), cgo va raporta o eroare în loc să genereze o secvență de apeluri incorectă pentru f(0). Nou în această versiune este îmbunătățirea detectării acestei condiții de eroare atunci când declarațiile incompatibile apar în fișiere diferite. #67699.

Objdump

Instrumentul objdump susține acum disassemblarea pe arhitectura 64-bit LoongArch (GOARCH=loong64), RISC-V (GOARCH=riscv64) și S390X (GOARCH=s390x).

Vet

Noua analiză tests raportează erori comune în declarațiile testelor, fuzzers, benchmarks și exemple în pachetele de teste, cum ar fi nume prost formate, semnături incorecte sau exemple care documentează identificatori inexistent. Unele dintre aceste erori pot duce la nepăstrarea testelor.

Analizorul printf existent raportează acum diagnostice pentru apeluri de formă fmt.Printf(s), unde s este un șir de format non-constant, fără alți parametri. Astfel de apeluri sunt aproape întotdeauna o eroare, deoarece valoarea s poate conține caracterul %; în schimb, folosește fmt.Print. 60529. Această verificare tinde să facă descoperiri în codul existent și, prin urmare, se aplică doar când versiunea limbajului (așa cum este specificat de directiva go a fișierului go.mod sau comentariile `//go:build) este cel puțin Go 1.24, pentru a evita apariția defectelor în integrarea continuă la actualizarea la toolchain-ul Go 1.24.

Analizatorul existent buildtag acum raportează diagnostice atunci când există o eroare în limita versiunii superioare Go în directiva //go:build. De exemplu, //go:build go1.23.1 se referă la o versiune punctată; în schimb, utilizați //go:build go1.23. #64127.

Analizatorul existent copylock acum raportează diagnostice atunci când variabila, declarată într-un ciclu „for” triplu, cum ar fi for i := iter(); done(i); i = next(i) { … }, conține sync.Locker, cum ar fi sync.Mutex. Go 1.22 a schimbat comportamentul acestor cicluri pentru a crea o nouă variabilă pentru fiecare iterație, copierea valorilor din iterația anterioară; această copiere nu este sigură pentru lock-uri. #66387.

GOCACHEPROG

Binarul intern cmd/go și mecanismul de cache pentru teste pot acum fi implementate de procese fiice, care implementează protocolul JSON între instrumentul cmd/go și procesul fiu, numit variabila de mediu GOCACHEPROG. Anterior, acesta era pentru GOEXPERIMENT. Detalii ale protocolului pot fi văzute în documentation.

Timp de execuție

Mai multe îmbunătățiri de performanță în runtime au redus cheltuielile pe CPU cu 2-3% în medie în rândul unui set de benchmark-uri reprezentative. Rezultatele pot varia în funcție de aplicație. Aceste îmbunătățiri includ o nouă implementare încorporată a map-ului bazată pe Tabelele Suedeze, o alocare de memorie mai eficientă pentru obiecte mici și o nouă implementare internă a mutex-ului în timpul execuției.

Noua implementare încorporată a map-ului și noul mutex intern al runtime-ului pot fi dezactivate prin setările GOEXPERIMENT=noswissmap și GOEXPERIMENT=nospinbitmutex în timpul compilării, respectiv.

Compilatorul

Compilatorul interzice deja definirea de metode noi cu tipuri de primire generate de cgo, dar era posibil să ocolim această restricție prin aliasul de tip. Go 1.24 acum raportează întotdeauna o eroare dacă primitorul denotează un tip cgo generat, direct sau indirect (prin alias de tip).

Linkerul

Linkerul acum generează un identificator de construcție GNU (înregistrarea ELF NT_GNU_BUILD_ID) pe platformele ELF și UUID (comanda de încărcare Mach-O LC_UUID) pe macOS, în mod implicit. Identificatorul de construcție sau UUID-ul este derivat din identificatorul de construcție Go. Acesta poate fi dezactivat cu flagul linker-ului -B none, sau suprascris cu flagul linker-ului -B 0xNNNN cu o valoare hexazecimală specificată de utilizator.

Rollover

Așa cum a fost menționat în notițele de lansare Go 1.22, Go 1.24 necesită acum Go 1.22.6 sau o versiune ulterioară pentru compilare. Dezvoltatorii se așteaptă ca Go 1.26 să necesite un release punctual Go 1.24 sau o versiune ulterioară pentru compilare.

Biblioteca standard

Acces la sistemul de fișiere restricționat la un director

Tip nou os.Root oferă posibilitatea de a efectua operații pe sistemul de fișiere în cadrul unui anumit director.

Funcția os.OpenRoot deschide un director și returnează os.Root. Metodele de pe os.Root acționează în acest director și nu permit ca calea să facă referire la locații din afara directorului, inclusiv cele care urmează link-uri simbolice dincolo de director. Metodele de pe os.Root reflectă majoritatea operațiunilor sistemului de fișiere disponibile în pachetul os, inclusiv, de exemplu, os.Root.Open, os.Root.Create, os.Root.Mkdir și os.Root.Stat.

Noua funcție de benchmark

Benchmarks pot acum să folosească o metodă mai rapidă și mai puțin predispusă la erori testing.B.Loop pentru a itera benchmark-ul precum for b.Loop() { … } în loc de structuri tipice de loop cu b.N precum for range b.N. Acest lucru oferă două avantaje semnificative:

  • Funcția de benchmark este executată exact o dată pentru fiecare -count, astfel încât pașii costisitori de setup și cleanup sunt executați o singură dată.
  • Parametrii apelului de funcție și rezultatele continuă să existe, împiedicând compilatorul să optimizeze complet corpul buclei.

Finalizatoare îmbunătățite

Nouă funcție runtime.AddCleanup este un mecanism de finalizare care este mai flexibil, mai eficient și mai puțin predispus la erori decât runtime.SetFinalizer. AddCleanup atașează o funcție de curățare obiectului, care va fi executată imediat ce obiectul devine inaccesibil. Totuși, spre deosebire de SetFinalizer, mai multe curățiri pot fi atașate unui singur obiect, curățirile pot fi atașate la pointere interne, iar curățirile de obicei nu cauzează scurgeri atunci când obiectele formează un ciclu și curățirile nu întârzie eliberarea unui obiect sau a obiectelor la care acesta se referă. Codul nou ar trebui să prefere AddCleanup înainte de SetFinalizer.

Nouă pachet weak

Pachetul nou weak oferă pointere slabe.

Pointerele slabe sunt un primitiv de nivel inferior, oferit pentru a crea structuri care utilizează eficient memoria, cum ar fi dicționare slabe pentru asocieri de valori, dicționare de canonizare pentru orice nu este acoperit de pachetul unique, și diverse tipuri de cache. Pentru a susține aceste cazuri de utilizare, această versiune oferă de asemenea runtime.AddCleanup și maphash.Comparable.

Noua bibliotecă crypto/mlkem

Pachetul nou crypto/mlkem implementează ML-KEM-768 și ML-KEM-1024.

ML-KEM este un mecanism post-cuantum pentru schimbul de chei, cunoscut anterior sub numele de Kyber și specificat în FIPS 203.

Noile biblioteci crypto/hkdf, crypto/pbkdf2 și crypto/sha3

Pachetul nou crypto/hkdf implementează o funcție de derivare a cheilor bazată pe HMAC “Extract-and-Expand” HKDF, conform RFC 5869.

Pachetul nou crypto/pbkdf2 implementează o funcție de derivare a cheilor bazată pe parolă PBKDF2, conform RFC 8018.

Pachetul nou crypto/sha3 implementează funcția hash SHA-3 și funcțiile SHAKE și cSHAKE pentru ieșire extensibilă, conform FIPS 202.

Toate cele trei biblioteci se bazează pe biblioteci existente de golang.org/x/crypto/…

Conformitate FIPS 140-3

Această versiune include un nou set de mecanisme pentru a asigura conformitatea cu FIPS 140-3.

Modul criptografic Go este un set de biblioteci interne standard care sunt folosite transparent pentru a implementa algoritmi aprobați FIPS 140-3. Aplicațiile nu necesită modificări pentru a utiliza modul criptografic Go pentru algoritmi aprobați.

Noua variabilă de mediu GOFIPS140 poate fi utilizată pentru a selecta versiunea modulului criptografic Go pentru utilizarea în compilare. Noua configurarea GODEBUG fips140 poate fi utilizată pentru a activa modul FIPS 140-3 în timpul execuției.

Go 1.24 include modul criptografic Go versiunea v1.0.0, care este în prezent testat cu un laborator CMVP acreditat.

Noua bibliotecă experimentală testing/synctest

Noua bibliotecă experimentală testing/synctest oferă suport pentru testarea codului concurent.

  • Funcția synctest.Run pornește un grup de goroutines într-o “bula” izolată. În bula funcțiile bibliotecii time funcționează pe ceasuri false.
  • Functions synctest.Wait așteaptă ca toate goroutines să fie blocate în bula curentă.

Detalii suplimentare pot fi găsite în documentația bibliotecii.

Biblioteca synctest este experimentală și trebuie activată prin setarea GOEXPERIMENT=synctest. API-ul bibliotecii poate fi modificat în versiuni viitoare. În #67434 se pot găsi mai multe detalii și se poate oferi feedback.

Modificări minore în biblioteca

archive

Implementările (*Writer.AddFS) în archive/zip și archive/tar scriu acum antetul directorului pentru un director gol.

bytes

Pachet bytes adaugă câteva funcții care lucrează cu iterații:

  • Lines returnează un iterator pentru liniile separate de newline într-un slice de byte.
  • SplitSeq returnează un iterator pentru toate subsecvențele unui slice de octeți, divizat de separator.
  • SplitAfterSeq returnează un iterator pentru subsecvențele unui slice de octeți, divizat după fiecare ocorrență a separatorului.
  • FieldsSeq returnează un iterator pentru subsecvențele unui slice de octeți în jurul secvențelor de caractere spațiu, așa cum este definit. unicode.IsSpace
  • FieldsFuncSeq returnează un iterator pentru subsecvențele unui slice de octeți în jurul secvențelor de puncte de cod Unicode, care satisfac predicatul.

crypto/aes

Valoarea returnată NewChipher nu mai implementează metodele NewCTR, NewGCM, NewCBCEncrypter și NewCBCDecrypter. Aceste metode erau nedocumentate și nu erau disponibile pe toate arhitecturile. Acum valoarea Block trebuie să fie transmisă direct funcțiilor corespunzătoare. crypto/cipher. În prezent, crypto/cipher încă verifică aceste metode pe valorile Block, chiar dacă acestea nu mai sunt suportate de biblioteca standard.

crypto/cipher

Nouă funcție NewGCMWithRandomNonce întoarce AEAD, care implementează AES-GCM, generând un număr aleatoriu de unică folosință în timpul Seal și adăugându-l la începutul textului criptat.

Implementarea Stream, returnat NewCTR când este utilizat cu crypto/aes este acum de câteva ori mai rapid pe amd64 și arm64.

NewOFB, NewCFBEncrypter și NewCFBDecrypter sunt acum declarate învechite. Modurile OFB și CFB sunt neautentificate, ceea ce permite, în general, atacuri active să manipuleze și să recupereze textul deschis. Aplicațiile sunt recomandate să folosească AEAD în schimb. Dacă un mod neautentificat Stream este necesar, poate fi folosit NewCTR în schimb.

crypto/ecdsa

PrivateKey.Sign creează acum o semnătură deterministă conform RFC 6979, dacă sursa de aleatorietate este nil.

crypto/md5

Valoarea returnată md5.New, implementază acum și interfața encoding.BinaryAppender.

crypto/rand

Funcția Citire garanția absenței eșecurilor. Dacă Read întâlnește o eroare în timpul citirii Reader, programul va ieși abrupt. Vă rugăm să rețineți că Reader-ul implicit este documentat să funcționeze întotdeauna cu succes, așa că această modificare ar trebui să afecteze doar acele programe care supraîncărcă variabila Reader. O excepție este nucleele Linux înainte de versiunea 3.17, unde Reader-ul implicit încă deschide /dev/urandom și poate eșua.

Pe Linux 6.11 și versiunile ulterioare, Reader-ul acum utilizează apelul de sistem getrandom prin vDSO. Aceasta este de câteva ori mai rapidă, de obicei pentru citiri mici.

Pe OpenBSD Reader-ul acum folosește arc4random_buf(3).

Nouă funcție Text acum poate genera șiruri de texte criptografice sigure.

crypto/rsa

GenerateKey acum returnează o eroare dacă se solicită o cheie de lungime mai mică de 1024 de biți. Toate metodele Sign, Verify, Encrypt și Decrypt returnează acum o eroare dacă sunt folosite cu o cheie de dimensiune mai mică de 1024 de biți. Astfel de chei sunt nesigure și nu ar trebui folosite. Setarea GODEBUG rsa1024min=0 restaurează comportamentul vechi, dar dezvoltatorii Go recomandă să se facă acest lucru doar în cazul în care este necesar și doar în teste, de exemplu, adăugând linia //go:debug rsa1024min=0 în fișierul de test. Nou exemplu GenerateKey oferă o cheie de test standard de 2024 de biți, ușor de utilizat.

Acum este sigur și mai eficient să apelăm PrivateKey.Precompute la PrivateKey.Validate. Precompute este acum mai rapid în prezența PrecomputedValues, de exemplu, când se extrage o cheie din JSON.

Pachetul acum respinge mai multe chei incorecte, chiar și atunci când Validate nu este apelat, și GenerateKey acum poate returna noi erori pentru surse de aleatoritate defectuoase. Câmpurile Primes și Precomputed al structurii PrivateKey sunt acum utilizate și validate chiar și când unele valori lipsesc. De asemenea, s-au făcut modificări în crypto/x509 pentru analiza și extragerea cheilor RSA, descrise mai jos.

SignPKCS1v15 și VerifyPKCS1v15 acum suportă SHA-512/224, SHA-512/256 și SHA-3.

GenerateKey acum utilizează o metodă ușor diferită pentru generarea exponentului privat (funcția Carmichael în loc de funcția Euler). Aplicațiile rare, care recreează cheile numai din numere prime, pot produce rezultate diferite, dar compatibile.

Operațiile asupra cheilor publice și private sunt acum de două ori mai rapide pe wasm.

crypto/sha*

crypto/subtle

Nouă funcție WithDataIndependentTiming permite utilizatorului să execute funcții cu funcții specifice arhitecturii, care garantează stabilitatea anumitor instrucțiuni în raport cu timpul valorii datelor. Acest lucru poate fi utilizat pentru a se asigura că codul creat pentru a funcționa într-un timp constant nu a fost optimizat prin funcții la nivel de procesor astfel încât să funcționeze într-un timp variabil. În prezent, WithDataIndependentTiming folosește bitul PSTATE.DIT pe arm64 și nu face nimic pe celelalte arhitecturi. Setarea GODEBUG dataindependenttiming=1 activează modul DIT pentru întreaga aplicație Go.

Ieșire XORBytes trebuie să se suprapună complet sau deloc cu intrarea. Comportamentul anterioară era nedefinit în alt mod, în timp ce acum XORBytes va panic.

crypto/tls

Serverul TLS acum suportă Encrypted Client Hello (ECH). Această funcționalitate poate fi activată prin completarea câmpului Config.EncryptedClientHelloKeys.

Un nou mecanism de schimb de chei post-cuantice X25519MLKEM768 este acum suportat și activat implicit când Config.CurvePreferences este nil. Setarea GODEBUG tlsmlkem=0 returnează valoarea implicită.

Suportul pentru schimbul de chei experimental X25519Kyber768Draft00 a fost eliminat.

Ordinea schimbului de chei este acum complet gestionată de pachetul crypto/tls. Ordinea Config.CurvePreferences este acum ignorată, iar conținutul este folosit doar pentru a determina ce schimburi de chei să fie incluse când câmpul este completat.

Un nou câmp ClientHelloInfo.Extensions enumeră lista de identificatori de extensii primite în mesajul Client Hello. Acest lucru poate fi util pentru a crea amprente SSL.

crypto/x509

Setarea GODEBUG x509sha1 a fost eliminat. Certficicate.Verify nu mai suportă semnăturile bazate pe SHA-1.

OID acum implementează interfețele encoding.BinaryAppender și encoding.TextAppender.

Câmpul implicit al politicilor certificate a fost schimbat din Certificate.PolicyIdentifiers pe Certificate.Policies. La analizarea certificatelor, ambele câmpuri vor fi completate, dar la crearea politicilor certificate vor fi preluate din câmpul Certificate.Policies în loc de Certificate.PolicyIdentifiers. Această modificare poate fi revertită prin configurarea GODEBUG x509usepolicies=0.

CreateCertificate acum va genera un număr serial folosind o metodă compatibilă cu RFC 5280 atunci când câmpul este Certificate.SerialNumber nil, în loc de a eșua.

Certificate.Verify acum suportă validarea politicii, așa cum este definit în RFC 5280 și RFC 9618. Un nou câmp VerifyOptions.CertificatePolicies poate fi setat la un set acceptabil de politici OIDs. Doar lanțurile de certificate cu grafice valide ale politicilor vor fi returnate din Certificate.Verify.

MarshalPKCS8PrivateKey acum returnează o eroare în loc să extragă cheia RSA incorectă. (MarshalPKCS1PrivateKey nu returnează o eroare și comportamentul său la cheile greșite furnizate rămâne nedefinit.)

ParsePKCS1PrivateKey și ParsePKCS8PrivateKey acum utilizează și validează valorile codificate CRT, astfel încât pot respinge cheile RSA incorecte care au fost acceptate anterior. Utilizarea setărilor GODEBUG x509rsacrt=0 revine la recalcularea valorilor CRT.

debug/elf

Pachet debug/elf adaugă suport pentru procesarea versiunilor simbolurilor în fișierele dinamice ELF (Executable and Linkable Format). Noua metodă File.DynamicVersions returnează o listă a versiunilor dinamice definite în fișierul ELF. Noua metodă File.DynamicVersionNeeds returnează o listă a versiunilor dinamice necesare acestui fișier ELF, care sunt definite în alte obiecte ELF. În cele din urmă, noile câmpuri Symbol.HasVersion și Symbol.VersionIndex indică versiunea simbolului.

encoding

Două noi interfețe TextAppender și BinaryAppender au fost introduse pentru a adăuga o reprezentare text sau binară a obiectului în felia de octeți. Aceste interfețe oferă aceeași funcționalitate ca și TextMarshaler și BinaryMarshaler, dar în loc să aloce o nouă felie de fiecare dată, adaugă datele direct în felia existentă. Aceste interfețe sunt acum implementate de tipurile din biblioteca standard care implementează deja TextMarshaler și/sau BinaryMarshaler.

encoding/json

În timpul construirii, câmpul structurii cu noua opțiune omitzero în eticheta câmpului structurii va fi omis dacă valoarea sa este zero. Dacă tipul câmpului are metoda IsZero() bool, va fi utilizată pentru a determina dacă valoarea este zero. În caz contrar, valoarea va fi zero dacă este valoarea zero pentru tipul său. Eticheta câmpului omitzero este mai curată și mai puțin predispusă la erori decât omitempty, atunci când intenția este de a omite valorile zero. În particular, spre deosebire de omitempty, omitzero omite valorile zero time.Time , care reprezintă o sursă frecventă de probleme.

Dacă sunt specificate ambele omitempty și omitzero, câmpul va fi omis dacă valoarea este goală sau zero (sau ambele simultan).

UnmarshalTypeError.Field acum include structuri încorporate pentru a oferi mesaje de eroare mai detaliate.

go/types

Toate structurile de date go/types, care dezvăluie secvențe de perechi de metode, cum ar fi Len() int și At(int) T, au acum și metode care returnează iteratoare, facilitând astfel scrierea de cod similar cu acesta:

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

Pentru acesta:

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

Metode: 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

Un nou DiscardHandler este un handler care nu este niciodată activat și întotdeauna își elimină ieșirea.

Level și LevelVar implementază acum interfața encoding.TextAppender.

math/*

net

ListenCondig folosește acum MPTCP implicit pe sistemele unde este suportat (până acum doar Linux).

IP implementază acum interfața encoding.TextAppender.

net/http

S-a schimbat restricția Transport asupra răspunsurilor de informație 1xx în răspuns la cerere. Anterior, acesta oprea cererea și returna o eroare după primirea a mai mult de 5 răspunsuri 1xx. Acum returnează o eroare doar dacă dimensiunea totală a tuturor răspunsurilor 1xx depășește setarea de configurare Transport.MaxResponseHeaderBytes.

În plus, când cererea are un hook pentru urmărire net/http/httptrace.ClientTrace.Got1xxResponse, nu mai există o restricție asupra numărului total de răspunsuri 1xx. Hook-ul Got1xxResponse poate returna o eroare pentru a opri cererea.

Transport și Server au acum un câmp HTTP2, care permite configurarea setărilor protocolului HTTP/2.

Campurile noi Server.Protocols și Transport.Protocols oferă o modalitate simplă de a configura ce protocoale folosește serverul sau clientul HTTP.

Serverul și clientul pot fi configurați pentru a suporta conexiuni necriptate HTTP/2.

Când Server.Protocols conține UnencrypterHTTP2, serverul va accepta conexiuni HTTP/2 pe porturi necriptate. Serverul poate accepta simultan HTTP/1 și HTTP/2 necriptat pe același port.

Când Transport.Protocols conține UnencryptedHTTP2 și nu conține HTTP1, transportul va folosi HTTP/2 necriptat pentru adresele http://. Dacă transportul este configurat să utilizeze atât HTTP/1, cât și HTTP/2 necriptat, va folosi HTTP/1.

Suportul pentru HTTP/2 necriptat utilizează "HTTP/2 cu cunoaștere prealabilă" (RFC 9113, secțiunea 3.3). Antetul depășit „Upgrade: h2c” nu este acceptat.

net/netip

Addr, AddrPort și Prefix acum implementează interfețele encoding.BinaryAppender și encoding.TextAppender.

net/url

URL acum implementează și interfața encoding.BinaryAppender.

os/user

În Windows Current poate fi utilizat acum în Windows Nano Server. Implementarea a fost actualizată pentru a evita utilizarea funcțiilor din biblioteca NetApi32, care nu este prezentă în Nano Server.

În Windows Current, Lookup și LookupId sprijină acum următoarele conturi de serviciu încorporate ale utilizatorului:

  • NT AUTHORITYSYSTEM
  • NT AUTHORITYLOCAL SERVICE
  • NT AUTHORITYNETWORK SERVICE

În Windows Current a fost semnificativ îmbunătățită când utilizatorul curent este conectat la un domeniu lent, ceea ce este frecvent pentru mulți utilizatori corporate. Noua performanță a implementării este acum de ordinul milisecundelor, comparativ cu implementarea anterioară, care putea dura câteva secunde, chiar minute, pentru a termina.

În Windows Current returnează acum utilizatorul proprietar al procesului, când firul curent se prezintă ca alt utilizator. Anterior, aceasta returna o eroare.

regexp

Regexp implementază acum interfața encoding.TextAdapter.

runtime

Funcția GOROOT a fost declarată acum ca fiind învechită. În noul cod, ar trebui să se prefere utilizarea căii sistemului pentru a determina binarul „go” și să se folosească go env GOROOT pentru a determina GOROOT.

strings

Pachet strings adaugă mai multe funcții pentru a lucra cu iteratoarele:

  • Lines returnează un iterator pe linile despărțite prin nouă linii în șir.
  • SplitSeq returnează un iterator pe toate substraturile șirului, despărțite de separator.
  • SplitAfterSeq returnează un iterator pe substraturi ale șirului, despărțit după fiecare apariție a separatorului.
  • FieldsSeq returnează un iterator pe substraturi ale șirului în jurul secvențelor de caractere spațiu, așa cum sunt definiteunicode.IsSpace
  • FieldsFuncSeq returnează un iterator pe substraturi ale șirului în jurul secvențelor de puncte de cod unicode care îndeplinesc predicatul.

sync

Implementarea sync.Map a fost modificată, îmbunătățind performanța, în special pentru modificările dicționarului. De exemplu, este mai puțin probabil ca modificările seturilor neintersectante să concureze pe dicționare mari, iar timpul de creștere necesar pentru realizarea de la un dicționar cu încărcare de competiție scăzută nu mai este necesar.

Dacă întâlniți probleme, setați GOEXPERIMENT=nosynchashtriemap în timpul compilării pentru a reveni la implementarea veche și, vă rugăm, completați formularul de problemă.

testing

Metode noi T.Context și B.Context returnează contextul, care este anulat după finalizarea testului și înainte de execuția funcțiilor de curățare a testului.

Metode noi T.Chdir și B.Chdir pot fi utilizate pentru a schimba directorul de lucru pe perioada execuției testului sau benchmark-ului.

text/template

Modelele suportă acum range-over-func și range-over-int.

time

Timp acum implementează interfețele encoding.BinaryAppender și encoding.TextAppender.

Porturi

Linux

Cum a fost anunțat în notele de lansare Go 1.23, Go 1.24 necesită kernel Linux versiunea 3.2 sau mai recent.

Darwin

Go 1.24 este ultima versiune care va funcționa pe macOS 11 Big Sur. Go 1.25 va necesita macOS 12 Monterey sau mai recent.

WebAssembly

Directiva de compilare go:wasmexport a fost adăugată în programele Go pentru a exporta funcții în gazda WebAssembly.

În WebAssembly System Interface Preview 1 (GOOS=wasip1 GOARCH=wasm) Go 1.24 suportă compilarea programului Go ca reactor/library prin specificarea flag-ului de compilare -buildmode=c-shared.

Mai multe tipuri sunt acum permise ca tip de argument sau rezultat pentru funcțiile go:wasmimport. În special, bool, string, uintptr și pointere către tipuri specifice sunt permise (detalii pot fi găsite în documentation), împreună cu tipuri întregi de 32 de biți și 64 de biți și tipuri float, și unsafe.Pointer, care sunt deja permise. Aceste tipuri sunt, de asemenea, permise ca tipuri de argument sau rezultat pentru funcțiile go:wasmexport.

Fișierele de suport pentru WebAssembly au fost mutate în lib/wasm din misc/wasm.

Dimensiunea inițială a memoriei a fost semnificativ redusă, mai ales pentru aplicațiile mici WebAssembly.

Windows

Portul de 32 de biți windows/arm (GOOS=windows GOARCH=arm) a fost marcat ca fiind defect. Detalii în #70705

Sursa: linux.org.ru

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster