Udgivelsen Go 1.22

Go 1.22 programmeringssprog er blevet lanceret af Google med samfundets deltagelse som en hybridløsning, der kombinerer høj ydeevne fra compilérbare sprog med fordelene ved scriptsprog, såsom nemheds ved at skrive kode, hurtig udvikling og sikkerhed mod fejl. Projektets kode distribueres under BSD-licensen.

Go-syntaxen er baseret på velkendte elementer fra C-sproget med enkelte lånte dele fra Oberon. Sproget er ret kortfattet, men koden er letlæselig og forståelig. Go-kode kompileres til adskilte binære eksekverbare filer, der kører nativt uden brug af en virtuel maskine (profilerings-, fejlfinding- og andre subsystemer til fejlsøgning integreres som runtime-komponenter), hvilket muliggør en ydeevne, der kan sammenlignes med programmer skrevet i C.

Projektet er oprindeligt udviklet med fokus på multitrådet programmering og effektiv drift på flerkjernede systemer, herunder at give operatorniveau værktøjer til at organisere parallelle beregninger og interaktion mellem parallelt udførte metoder. Sproget tilbyder også indbyggede værktøjer til at beskytte mod overskridelse af tilladte områder af tildelt hukommelse og giver mulighed for brug af en garbage collector.

Blandt ændringerne i den nye udgave:

  • Der er tilføjet understøttelse af områdebestemmelse af heltal i 'for'-løkkerne, for eksempel kan du nu bruge 'for i := range 10 {…}' til at gennemgå værdier fra 0 til 9.
  • Der er tilføjet eksperimentel (GOEXPERIMENT=rangefunc) understøttelse af funktionsområdebestemmelse i 'for'-løkkerne, hvilket tillader at angive en funktion som iterator. For eksempel 'for i, x := range slices.Backward(s) {…}'.
  • Et gammelt problem med 'for'-løkker, der forårsagede, at variablerne i løkken blev delt mellem forskellige iterationer ved kald af goroutines, er blevet løst. For eksempel vil koden values := []string{"a", "b", "c"} for _, v := range values { go func() { fmt.Println(v) done <- true }() } nu udskrive "a", "b" og "c" i stedet for kun "c", som det var tidligere.
  • Der er gennemført optimering af hukommelsesdrift i runtime, der har resulteret i en ydelsesforøgelse på 1-3% og en reduktion i hukommelsesforbruget i de fleste applikationer med 1%.
  • Arbejdet med at implementere optimeringer baseret på profilering af kode (PGO – Profile-guided optimization) i kompilereren er fortsat, hvilket muliggør hensyntagen til funktioner, der bestemmes under programudførelse. I den nye version er der blevet implementeret værktøjer til devirtualisering i kompilereren for at erstatte indirekte kald af forskellige metoder med udførelsen af udfoldede inline-blokke.
  • Ved aktivering af PGO har ændringen ført til en ydelsesforbedring på 2-14% for de fleste programmer.
  • Der er tilføjet en eksperimentel (GOEXPERIMENT=newinliner) forbedret implementering af mekanismen for udfoldning (inlining) af kald i kompilereren, som bruger heuristik til at skelne mellem vigtige og mindre væsentlige operationer.
  • Den standardbibliotek er blevet tilføjet pakken «math/rand/v2», som tilbyder et mere sammenhængende API og benytter hurtigere algoritmer til generering af pseudo-tilfældige tal.
  • I pakken net/http.ServeMux er muligheden for at angive metoder og masker i skabeloner blevet tilføjet; for eksempel vil skabelonen «GET /static/{id}/» blive anvendt på anmodninger med HTTP-metoden «GET» og bevare værdien af det andet segment af den anmodede sti i identifikatoren «id».
  • I pakken database/sql er der tilføjet understøttelse af typen Null[T], som muliggør scanning af kolonner, der kan have værdien NULL. Pakken slices har fået tilføjet funktionen Concat til at sammenflette flere slices af enhver type.
  • I kommandoerne til arbejde med arbejdsrum (modulsamlinger) er der blevet givet mulighed for at bruge kataloget «vendor», som indeholder afhængigheder til indholdet af arbejdsrummet. Kataloget oprettes ved udførelsen af kommandoen «go work vendor» og bruges i build-kommandoer, når der angives indstillingen "-mod=vendor" (som indgår som standard, når kataloget vendor er til stede).

Ændringer i adfærden af værktøjer.

  • go get understøttes ikke længere uden for modulet i den forældede GOPATH-tilstand (dvs. med GO111MODULE=off). Andre build-kommandoer, såsom go build og go test, vil fortsætte med at fungere for forældede GOPATH-programmer i en ubestemt periode.
  • go mod init forsøger ikke længere at importere modulkrav fra konfigurationsfiler for andre leverandørværktøjer (som Gopkg.lock).
  • go test -cover viser nu sammenfatninger om dækning for pakker, der ikke har deres egne testfiler. Før Go 1.22 rapporterede go test -cover for en sådan pakke: mymod/mypack [ingen testfiler]

    og nu med Go 1.22 betragtes funktioner i pakken som ikke dækket: mymod/mypack coverage: 0.0% af udsagn. Bemærk: hvis pakken slet ikke indeholder eksekverbar kode, kan vi ikke rapportere et signifikant dækningsprocent; for sådanne pakker vil go test fortsætte med at rapportere om manglende testfiler.

  • Webgrænsefladen til trace-værktøjet er blevet let opdateret som en del af arbejdet med at understøtte den nye sporingssystem, løst nogle problemer, og forbedret læsbarheden af de forskellige sider. Webgrænsefladen understøtter nu udforskning af sporinger i en strømorienteret visning. Trace-viseren viser nu også den samlede varighed af alle systemopkald. Disse forbedringer gælder kun for visning af sporinger skabt af programmer, der er bygget på Go 1.22 eller nyere. I fremtidige udgaver vil nogle af disse forbedringer blive anvendt på sporinger skabt af den gamle version af Go.
  • Kørselmiljøet gemmer nu affaldsindsamlingsmetadata baseret på typer tættere på hvert objekt i hukommelsen. Denne ændring reducerer også hukommelsesforbruget for de fleste Go-programmer med cirka 1% ved at deduplicere overflødige metadata. I nogle programmer kan forbedringen være mindre, da denne ændring justerer grænserne for klassestørrelse for hukommelsesallokering, hvilket betyder, at nogle objekter kan flyttes til en højere klassestørrelse. Som følge af denne ændring vil adresserne på nogle objekter, der tidligere altid var justeret til 16-byte grænse (eller højere), nu kun være justeret til 8-byte grænse. Nogle programmer, der bruger assembler-instruktioner, som kræver, at hukommelsesadresser er justeret til en størrelse større end 8 byte og stolede på den tidligere adfærd fra hukommelsesallokatorens justering, kan fejle, men vi forventer, at sådanne programmer vil være sjældne. Sådanne programmer kan oprettes med GOEXPERIMENT=noallocheaders for at vende tilbage til den gamle metadata-model og genoprette den tidligere justeringsadfærd, men pakkeejere bør opdatere deres assemblerkode for at undgå antagelser om justering, da denne løsning vil blive fjernet i en fremtidig udgivelse.
  • Som nævnt i udgivelsesnoterne for Go 1.20 kræver Go 1.22 nu en endelig version af Go 1.20 eller nyere for den første bygning. Vi forventer, at Go 1.24 vil kræve en endelig version af Go 1.22 eller nyere for den første bygning.
    Original (go.dev)

Kilde: linux.org.ru

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster