Go 1.22 väljaanne

Esitatud on Go 1.22 programmeerimiskeele väljaanne, mida arendab Google koos kogukonnaga, mis on hübriidne lahendus, mis ühendab kompileeritavate keelte kõrge jõudluse skriptikeelte nagu koodi lihtne kirjutamine, arendamise kiirus ja vigade kaitsega. Projekti kood on vabalt kättesaadav BSD-litsentsi alusel.

Go süntaks põhineb tuttavatel C keele elementidel, võttes teatud laenud Modula-2 keelest. Keel on piisavalt lakooniline, kuid koodi on lihtne lugeda ja mõista. Go keeles kirjutatud kood kompileeritakse eraldiseisvatesse binaarsetesse täitmisfailidesse, mis käivitatakse natiivselt ilma virtuaalkeskkonna kasutamiseta (profiili, silumise ja muude probleemide avastamise alamprogrammid integreeritakse runtime-komponentidena), mis võimaldab saavutada jõudlust, mis on võrreldav C keeles kirjutatud programmidega.

Projekt on algselt loodud silmas pidades mitme lõime programmeerimist ja tõhusat toimimist mitme tuumaga süsteemides, sealhulgas pakkudes operaatoritasemel realiseeritud vahendeid paralleelsete arvutuste korraldamiseks ja paralleelselt toimivate meetodite vaheliseks suhtlemiseks. Keel pakub samuti sisseehitatud kaitsevahendeid mälublokkidest väljatuleku vältimiseks ja võimaldab prügikoristaja kasutamist.

Uue väljaande muudatused:

  • For tsüklitesse on lisatud tugi täisarvude vahemike määratlemiseks. Näiteks väärtuste läbimiseks vahemikus 0 kuni 9 võib nüüd kasutada tsüklit «for i := range 10 {…}».
  • For tsüklitesse on lisatud eksperimentaalne (GOEXPERIMENT=rangefunc) tugi vahemike määratlemise funktsioonidele, mis võimaldab määrata funktsiooni iteratsiooniks. Näiteks «for i, x := range slices.Backward(s) {…}»
  • Lahendatud pikaajaline probleem for-tsüklitega, mis viis kaasprotseduuride (goroutine) kutsumise ajal tsükli muutuja ühiskasutusse erinevates iteratsioonides. Näiteks kood values := []string{"a", "b", "c"} for _, v := range values { go func() { fmt.Println(v) done <- true }() } väljastab nüüd "a", "b" ja "c", mitte ainult "c", nagu see oli varem.
  • Optimeeritud mälu kasutamine runtime'is, mis tõi kaasa jõudluse kasvu 1-3% ja mälu tarbimise vähenemise enamikus rakendustes 1%.
  • Tööd jätkatakse kompilaatoris optimeerimiste rakendamisel, mis põhinevad koodi profiilimise tulemustel (PGO — Profiilijuhitud optimeerimine), mis võimaldavad arvestada programmijooksu ajal määratud eripäradega. Uues versioonis on kompilaatoris rakendatud devirtualiseerimise vahendeid, et asendada erinevate meetodite kaudsed kutsed välja arendatud inline-blokkide täitmisega.
  • PGO sisselülitamisel lubatud muudatus võimaldas enamikus programmides jõudlust suurendada 2-14%.
  • Kompilaatorisse on lisatud eksperimentaalne (GOEXPERIMENT=newinliner) täiustatud rakenduste (inlining) mehhanism, mis kasutab heuristikat oluliste ja vähemoluliste toimingute jagamiseks.
  • Standardteeki on lisatud pakett «math/rand/v2», mis pakub terviklikumat API-d ja kasutab kiiremaid pseudo-juhuslike arvude genereerimise algoritme.
  • Paketti net/http.ServeMux on lisatud võimalus määrata meetodeid ja mustreid, näiteks muster «GET /static/{id}/» rakendub «GET» HTTP-meetodi taotlustele ning salvestab soovitud raja teise segmendi väärtuse identifikaatoriks «id».
  • Paketti database/sql on lisatud Null[T] tüübi tugi, mis võimaldab skanneerida veerge, mis võivad võtta NULL väärtuse. Paketti slices on lisatud Concat funktsioon, mis võimaldab mitme sildi ühendamist mis tahes tüübi puhul.
  • Tööruumide (moodulikollektsioonide) meeskondades on võimalus kasutada "vendor" katalooge, mis sisaldavad sõltuvusi töökeskkonnast. Kataloog luuakse käsu „go work vendor” käivitamisel ja seda kasutatakse ehituskäskudes, kui määratakse valik "-mod=vendor" (sisaldub vaikimisi, kui kataloog on olemas).

Utiliitide käitumise muudatused.

  • Käsk "go get" ei ole enam toetatud väljaspool moodulit vananenud GOPATH režiimis (st GO111MODULE=off). Teised ehituskomandod, nagu go build ja go test, jätkavad töötamist vananenud GOPATH programmide jaoks määramata ajaks.
  • Käsk "go mod init" ei püüa enam importida moodulite nõudeid teiste pakkujate konfigureerimisfailidest (nt Gopkg.lock).
  • Käsk "go test -cover" prindib nüüd kokkuvõtete andmed katvuse kohta katvatest pakettidest, millel pole oma testifailide. Enne Go 1.22 teatas go test -cover sellise paketi puhul? mymod/mypack [no test files]

    ja nüüd Go 1.22-s peetakse paketi funktsioone katmatuks: mymod/mypack coverage: 0.0% avaldumist. Pane tähele: kui paketil ei ole üldse täidetavat koodi, ei saa me teatada märkimisväärsest katmisprotsendist; sellistele pakettidele teavitab go test jätkuvalt testifailide puudumisest.

  • Trace tööriista veebiliides on saanud väikese värskenduse uue jälgimise toetamiseks, lahendatud on mõned probleemid ning parandatud erinevate lehtede loetavust. Veebiliides toetab nüüd jälgimiste uurimist voogude suunatud vaates. Jälgimisvaatur kuvab nüüd ka kõikide süsteemikõnede kogu kestuse. Need täiustused kehtivad ainult jälgimiste vaatamiseks, mis on loodud Go 1.22 või uuema versiooni abil. Tulevases väljalaskes kantakse mõned neist täiustustest üle ka vanemate Go versioonide loodud jälgimistele.
  • Täideviimiskeskkond salvestab nüüd prügi kogumise metainfot tüüpide põhjal, mis on lähemal iga praeguse mälestiku objektile. See muudatus vähendab enamikus Go programmides mälu vajadust umbes 1% võrra, vähendades üleliigsete metainformatsiooni dubleerimist. Mõnedes programmides võib paranemine olla väiksem, kuna see muudatus kohandab mäluhalduri suuruste klasside piire, mistõttu mõned objektid võivad liikuda kõrgema suuruse klassi peale. Selle muudatuse tulemusena on mõned objektide aadressid, mis varem olid alati 16-baidise (või suurema) piiri kohal, nüüd ainult 8-baidise piiri kohal. Mõned programmid, mis kasutavad assembleri käske, kus aadressid peavad olema ühiselt üle 8-baiti ja sõltuvad eelmise mäluhalduri ühtlaste piiretest, võivad ebaõnnestuda, kuid me eeldame, et sellised programmid on haruldased. Nende programmide loomine on võimalik, kasutades GOEXPERIMENT=noallocheaders, mis võimaldab tagastada vana metainfo mudeli ja taastada varasem käitumise ühtlustamine, kuid paketihaldurid peaksid oma assembleri koodi uuendama, et vältida eelduste tegemist ühtlustamise kohta, kuna see lahendus eemaldatakse tulevases väljaandes.
  • Nagu mainitud Go 1.20 väljaande märkustes, nõuab Go 1.22 nüüd Go 1.20 või uuema versiooni lõppversiooni esmakordset kompileerimist. Ootame, et Go 1.24 nõuab Go 1.22 või hilisema versiooni lõppversiooni esmakordset kompileerimist.
    Originaal (go.dev)

Allikas: linux.org.ru

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster