GoSuda

Oversikt over Go 1.24: Swiss Table-kart, ML-KEM, os.Root og testing/synctest

By Lemon Mint views ...

Go 1.24 utvikler seg til å bli en betydelig utgivelse, som introduserer en rekke forbedringer med fokus på ytelse, sikkerhet og utvikleropplevelse. Disse endringene har som mål å gjøre Go enda kraftigere og mer effektiv for bygging av moderne applikasjoner.

Ytelsesløft

En generell ytelsesforbedring med en reduksjon i CPU-overhead på 2–3 % på tvers av et sett med representative benchmarker. Forbedringene omfatter en ny innebygd implementasjon av map, mer effektiv minneallokering for små objekter, og en ny runtime-intern mutex-implementasjon. Resultatene kan variere avhengig av applikasjon.

Post-kvantekryptografi

Introduksjon av pakken crypto/mlkem, som implementerer ML-KEM-768 og ML-KEM-1024. ML-KEM er en post-kvantemekanisme for nøkkelutveksling, tidligere kjent som Kyber og spesifisert i FIPS 203. Dette tillegget forbereder Go for fremtidens kryptografiske sikkerhet.

TLS-forbedring

Støtte for Encrypted Client Hello (ECH) i TLS. Denne funksjonen kan aktiveres ved å fylle ut feltet Config.EncryptedClientHelloKeys, noe som styrker personvernet og sikkerheten for TLS-forbindelser.

Ny Swiss Table-map

En forbedret implementasjon av map for bedre ytelse. Denne nye implementasjonen er basert på Swiss Tables, og kan deaktiveres med build-flagget GOEXPERIMENT=noswissmap.

Oppdatering av sync.Map

Forbedret ytelse for modifikasjoner av map i sync.Map. Modifikasjoner av disjunkte nøkkelsett er betydelig mindre utsatt for konkurranse på større map, og det er ikke lenger nødvendig med en oppstartsfase for å oppnå lavkonkurranse-lastinger fra map. Dersom du støter på problemer, kan du gå tilbake til den gamle implementasjonen ved å bruke GOEXPERIMENT=nosynchashtriemap.

Forbedret JSON-marshaling

En ny valgfri omitempty-tagg for smartere utelating av struct-felt under JSON-marshaling. Ved marshaling vil et struct-felt med alternativet omitempty utelates dersom verdien er null. Dersom feltets type har en metode IsZero() bool, vil denne brukes for å avgjøre om verdien er null.

Runtime-opprydding

Introduksjon av funksjonen AddCleanup for å erstatte SetFinalizer for bedre ressursstyring. I motsetning til SetFinalizer gjenoppliver den ikke objektet den er knyttet til for finalisering, og flere opprydningsfunksjoner kan knyttes til ett enkelt objekt. Ny kode bør foretrekke AddCleanup fremfor SetFinalizer.

Verktøydirektiver i go.mod

Forbedret sporing av kjørbare avhengigheter ved hjelp av verktøydirektiver i go.mod. Dette fjerner behovet for den tidligere løsningen med å legge til verktøy som blanke importer i en fil som konvensjonelt heter «tools.go».

Katalogbegrenset tilgang

Ny type os.Root for kontrollerte filsystemoperasjoner. Typen os.Root gir muligheten til å utføre filsystemoperasjoner innenfor en bestemt katalog, og forhindrer tilgang utenfor den angitte banen.

Forbedringer av testing

Ny pakke testing/synctest for testing av samtidig kode. Funksjonen synctest.Run starter en gruppe goroutiner i en isolert «boble», og funksjonen synctest.Wait venter til alle goroutiner i den gjeldende boblen er blokkert. Denne pakken er eksperimentell og må aktiveres ved å sette GOEXPERIMENT=synctest ved bygging.

Build-cache

Kjørbare filer fra go run caches nå for raskere kjøring. Dette gjør gjentatte kjøringer raskere på bekostning av at cachen blir større.

Cgo-ytelse

Nye annoteringer #cgo noescape og #cgo nocallback for bedre Cgo-ytelse. #cgo noescape cFunctionName forteller kompilatoren at minne sendt til C-funksjonen ikke unnslipper. #cgo nocallback cFunctionName forteller kompilatoren at C-funksjonen ikke kaller tilbake til noen Go-funksjoner.

Svake pekere

Støtte for svake pekere for trygt å referere til minne uten å hindre frigjøring. Svake pekere er en lavnivåprimitiv som er laget for å muliggjøre minneeffektive strukturer, som svake map for å knytte verdier sammen, kanoniseringsmap og ulike typer cacher.

Benchmark-forbedring

Ny metode testing.B.Loop for raskere og mindre feilutsatte benchmarker. Benchmark-funksjonen vil kjøres nøyaktig én gang per -count, slik at kostbare oppsett- og oppryddingstrinn kjøres bare én gang. Funksjonskallparametere og resultater holdes i live, noe som hindrer kompilatoren i å optimalisere bort løkkekroppen fullstendig.

Go 1.24 utvikler seg til å bli en betydelig utgivelse, og tilbyr vesentlige forbedringer på tvers av ulike aspekter ved språket og økosystemet.

Oversikt over Go 1.24