Versjonen av programmeringsspråket Go 1.22 har blitt sluppet, utviklet av Google med deltakelse fra fellesskapet som en hybridløsning som kombinerer høy ytelse fra kompilert språk med fordelene fra skriptspråk, som enkel skriveprosess, rask utvikling og feilbeskyttelse. Koden til prosjektet distribueres under BSD-lisensen.
Go-syntaksen er basert på kjente elementer fra C-språket med enkelte lånte elementer fra Oberon-språket. Språket er ganske kortfattet, men koden er lett å lese og forstå. Kode skrevet i Go kompileres til separate binære kjørbare filer som kjøres nativt, uten bruk av en virtuell maskin (profilerings-, feilsøkings- og andre systemer for feildeteksjon integreres som runtime-komponenter), noe som gir ytelse sammenlignbar med programmer skrevet i C.
Prosjektet er opprinnelig utviklet med fokus på flertrådet programmering og effektiv drift på flerkjernede systemer, og gir også operator-nivåverktøy for å organisere parallelle beregninger og interaksjon mellom parallelt kjørende metoder. Språket gir også innebygde verktøy for å hindre overskridelse av dedikerte minneområder og muliggjør bruken av søppelsamler.
Blant endringene i den nye utgivelsen:
- For-løkker har fått støtte for å definere intervaller med heltall, for eksempel for å iterere verdier fra 0 til 9 kan nå brukes for-løkken «for i := range 10 {…}».
- For-løkker har fått eksperimentell støtte for intervallfunksjoner (GOEXPERIMENT=rangefunc), som lar deg spesifisere en funksjon som iterator. For eksempel, «for i, x := range slices.Backward(s) {…}».
- Et gammelt problem med for-løkker er løst, som tidligere førte til at koroutines (goroutine) delte variabler i ulike iterasjoner. Nå vil koden values := []string{"a", "b", "c"} for _, v := range values { go func() { fmt.Println(v) done <- true }() } skrive ut «a»,«b» og «c», i stedet for bare «c», som før.
- Det er gjort optimaliseringer for minnehåndtering i runtime, noe som har ført til en ytelsesforbedring på 1-3% og redusert minneforbruket i de fleste applikasjoner med 1%.
- Arbeidet med å implementere optimaliseringer i kompilatoren basert på profilering av kode (PGO - Profilguidet optimalisering) fortsetter, noe som gjør det mulig å ta hensyn til egenskaper som bestemmes under programkjøringen. Den nye versjonen i kompilatoren inneholder avvirtueringsteknikker for å erstatte indirekte kall av ulike metoder med utførte inline-blokker.
- Ved aktivering av PGO har den nye tilpasningen økt ytelsen til de fleste programmer med 2-14%.
- Kompilatoren har fått et eksperimentelt (GOEXPERIMENT=newinliner) forbedret implementering av mekanismen for inlining av kall, som bruker heuristikker for å skille mellom viktige og mindre viktige operasjoner.
- Standardbiblioteket har fått pakken «math/rand/v2», som tilbyr en mer helhetlig API og bruker raskere algoritmer for generering av pseudotilfeldige tall.
- I pakken net/http.ServeMux er det lagt til mulighet for å angi metoder og masker i mønstre, for eksempel vil mønsteret «GET /static/{id}/» bli brukt på forespørslene med HTTP-metoden «GET» og lagre verdien av den andre segmentet i den forespurte banen i identifikatoren «id».
- I pakken database/sql er det lagt til støtte for typen Null[T], som tillater skanning av kolonner som kan ha NULL-verdi. I pakken slices er det lagt til en funksjon Concat for å flette flere skiver av enhver type.
- I kommandoene for arbeid med arbeidsområder (modulsamlinger) er det mulig å bruke katalogen «vendor», som inneholder avhengigheter til innholdet i arbeidsområdet. Katalogen opprettes når «go work vendor»-kommandoen kjøres og brukes i byggekommandoer når alternativet "-mod=vendor" er angitt (som standard inkludert når katalogen vendor er til stede).
Endringer i oppførselen til verktøyene.
- go get støttes ikke lenger utenfor modulen i den utdaterte GOPATH-modusen (det vil si med GO111MODULE=off). Andre byggekommandoer, som go build og go test, vil fortsatt fungere for utdaterte GOPATH-programmer i en ubestemt periode.
- go mod init prøver ikke lenger å importere modulkrav fra konfigurasjonsfiler for andre leverandørverktøy (slik som Gopkg.lock).
- go test -cover gir nå oppsummerende data om dekning for de dekkede pakkene som ikke har sine egne testfiler. Frem til Go 1.22 rapporterte go test -cover for en slik pakke? mymod/mypack [ingen testfiler]
og nå med Go 1.22 anses funksjoner i pakken som uten dekning: mymod/mypack dekning: 0,0% av uttalelsene. Vær oppmerksom på: hvis pakken overhodet ikke inneholder kjørbar kode, kan vi ikke rapportere en betydelig dekning; for slike pakker vil go test fortsatt rapportere fravær av testfiler.
- Webgrensesnittet til verktøyet trace har fått en liten oppdatering som en del av arbeidet med å støtte den nye trace-mekanikken, noen problemer er løst og lesbarheten til de ulike sidene er forbedret. Webgrensesnittet støtter nå utforskning av spor i en strøm-orientert visning. Trace-viseren viser nå også den totale varigheten av alle systemanrop. Disse forbedringene gjelder kun for visning av spor opprettet av programmer laget med Go 1.22 eller nyere. I fremtidige utgivelser vil noen av disse forbedringene bli innlemmet i spor som er opprettet med eldre versjoner av Go.
- Kjøringsmiljøet lagrer nå søppeloppsamlingsmetadata basert på typer nærmere hvert heap-objekt. Denne endringen reduserer også minnebruken for de fleste Go-programmer med omtrent 1 % gjennom deduplisering av overflødige metadata. I noen programmer kan forbedringen være mindre, ettersom denne endringen justerer grensen for klassen størrelsen til minnebehandleren, slik at noen objekter kan flyttes til en høyere størrelsesklasse. Som en konsekvens av denne endringen vil adresser til noen objekter som tidligere alltid var justert på en 16-byte grense (eller høyere), nå kun være justert på en 8-byte grense. Noen programmer som bruker assembler-instruksjoner som krever at minneadresser er justert på en størrelse større enn 8 byte, og som er avhengige av den tidligere atferden til minnebehandlerens justering, kan feile, men vi forventer at slike programmer vil være sjeldne. Slike programmer kan opprettes med GOEXPERIMENT=noallocheaders med mulighet for å gå tilbake til den gamle metadata-modellen og gjenopprette den tidligere atferden til justeringen, men pakkeeiere bør oppdatere assemblerkoden sin for å unngå antagelser om justering, siden denne omveien vil bli fjernet i fremtidige utgivelser.
- Som nevnt i merknadene til Go 1.20-utgivelsen, krever Go 1.22 nå den endelige versjonen av Go 1.20 eller nyere for første bygging. Vi forventer at Go 1.24 vil kreve den endelige versjonen av Go 1.22 eller nyere for første bygging.
Originalen (go.dev)
Kilde: linux.org.ru
