On esitles program keele Go 1.22, mida arendab Google koos kogukonnaga hübriidlahendusena, mis ühendab komplitseerivate keelte kõrge jõudluse ning skriptikeelte eelised, nagu koodi kirjutamise lihtsus, kiire arendus ja vigade kaitse. Projekti kood on jagatud BSD-litsentsi alusel.
Go süntaks põhineb tuttavatel C-keele elementidel, koos eri osade laenamisega Oberoni keelest. Keel on piisavalt lakooniline, kuid samas on kood hõlpsasti loetav ja arusaadav. Go kood kompileeritakse iseseisvatesse binaarsetesse käivitatavatesse failidesse, mis töötavad natiivselt, ilma virtuaalmasinata (profiilimise, silumise ja teiste jooksuaegsete probleemide avastamise alamsüsteemide moodulid on integreeritud jooksva komponentidena), mis võimaldab saavutada jõudlust, mis sarnaneb C-keeles kirjutatud programmidega.
Projekt on algselt arendatud silmas pidades mitme lõime programmeerimist ja tõhusat tööd mitme südamiku süsteemides, pakkudes sealhulgas korraldusvahendeid paralleelsete arvutuste ja paralleelselt töötavate meetodite vahelise suhtluse korraldamiseks. Keel pakub ka sisseehitatud vahendeid mälu lubamatute alade ülesaamise eest kaitsmiseks ning toob kaasa võimaluse kasutada prügikollektsiooni.
Among the changes in the new release:
- For tsüklitesse on lisatud tugi täisarvude vahemike määramiseks, näiteks 0 kuni 9 väärtuste iteratsiooniks saab nüüd kasutada tsüklit "for i := range 10 {…}".
- For tsüklitesse on lisatud eksperimentaalne (GOEXPERIMENT=rangefunc) tugi vahemike määramise funktsioonide jaoks, mis võimaldab määrata funktsiooni iteratooriks. Näiteks "for i, x := range slices.Backward(s) {…}".
- On lahendatud pikaajaline probleem for tsüklite osas, mis tekitas korraga lotitud muutuja jagamist erinevates iteratsioonides koos korutustega (goroutine). Näiteks kood values := []string{"a", "b", "c"} for _, v := range values { go func() { fmt.Println(v) done <- true } } trükkib nüüd "a", "b" ja "c", mitte ainult "c", nagu see oli varem.
- Runtime'i mälu käsitlemine on optimeeritud, mis on toonud kaasa jõudluse kasvu 1-3% ning enamiku rakenduste mälu tarbimise vähenemise 1%.
- Jätkub töö parandusoptimeerimise rakendamiseks kompilaatoris, mis põhineb koodi profileerimise tulemustel (PGO — profile-guided optimization), võimaldades arvesse võtta omadusi, mis määratakse programmi käimise ajal. Uues versioonis on kompilaatoris kasutusele võetud devirtuaalimise tööriistad, et asendada erinevate meetodite kaudsed kutsed lahti kirjutatud inline-blokkide täitmisega.
- PGO sisselülitamisel on lisamuudatus toonud kaasa enamikus programmidest jõudluse tõusu 2-14%.
- Kompilaatorisse on lisatud eksperimentaalne (GOEXPERIMENT=newinliner) täiustatud mehhanismi rakendamise (inlining) teostus, mis kasutab heuristikat oluliste ja vähemoluliste operatsioonide eristamiseks.
- Standardbibliotekisse on lisatud pakett «math/rand/v2», kus on pakutud terviklikumat API-d ja kasutusele on võetud kiiremad psudo-juhuslike arvude genereerimise algoritmid.
- Pakett net/http.ServeMux on saanud uue võimaluse määrata meetodeid ja mustreid šabloonides, näiteks šabloon «GET /static/{id}/» rakendatakse HTTP meetodiga «GET» päringutele ja säästab teise küsitud teeraja segmendi väärtuse tunnuses «id».
- Paketti database/sql on lisatud tugi Null[T] tüübi jaoks, mis võimaldab skaneerida veerge, mis võivad sisaldada NULL väärtust. Paketti slices on lisatud funktsioon Concat, et ühendada mitmeid slaide mis tahes tüübist.
- Tööruumide (moodulite kogude) käsud võimaldavad nüüd kasutada katalooge «vendor», mis sisaldavad sõltuvusi tööruumi sisule. Kataloog luuakse käsu „go work vendor” täitmisel ja seda kasutatakse ehituskomandodes, kui seatakse valik "-mod=vendor" (sh automaatselt, kui «vendor» kataloog on olemas).
Muutused utiliitide käitumises.
- go get ei toetata enam 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 aja jooksul.
- go mod init ei püüa enam importida sõltuvuste nõudeid muude pakkujate konfiguratsioonifailidest (nt Gopkg.lock).
- go test -cover nüüd prindib ülevaate katteandmetest katmiseks mõeldud pakettide kohta, millel pole oma testifailid. Enne Go 1.22 teatas go test -cover sellise paketi kohta? mymod/mypack [no test files]
Ja nüüd, alates Go 1.22, peetakse paketi funktsioone katmata: mymod/mypack coverage: 0.0% of statements. Pange tähele: kui paketil ei ole üldse täitevkoodi, ei saa me edastada tähenduslikku katte protsenti; selliste pakettide puhul jätkab go test teavitamist testifailide puudumisest.
- Trace'i tööriista veebiliides on saanud kerge uuenduse seoses uue traceback'i toetamistööd, parandatud on mõned probleemid ja erinevate lehtede loetavust on parendatud. Veebiliides toetab nüüd jälgimisprotsesside uurimist voogude orienteeritud vaates. Trace'i vaatamine näitab nüüd ka kõigi süsteemikutsungite täielikku kestust. Need täiendused kehtivad ainult jälgimiste vaatamiseks, mis on loodud programmide abil, mis on loodud Go 1.22 või uuema versiooni abil. Tulevases väljaandes toovad mõned neist täiustustest kaasa ka jälgimised, mis on loodud vana Go versiooniga.
- Täitmisajad salvestavad nüüd prügikogu metaandmed tüüpide alusel, mis on iga heap-objekti lähedal. See muudatus vähendab ka enamikus Go programmides mälukulu umbes 1% tänu üleliigsete metaandmete eemaldamisele. Mõnedes programmides võib parandus olla väiksem, kuna muudatus kohandab mälja jagaja suuruse klassi piire, mistõttu mõned objektid võivad liikuda kõrgema suuruse klassi peale. Selle muudatuse tagajärjeks on see, et mõned objektide aadressid, mis varem olid alati 16-baiti (või rohkem) piiri järgi joondatud, on nüüd joondatud vaid 8-baiti piiri järgi. Mõned programmid, mis kasutavad assembleri juhiseid, mis nõuavad, et mälu aadressid oleksid suuremate kui 8-baiti suurusega joondatud ja sõltuvad eelnevast mälja joondamise käitumisest, võivad ebaõnnestuda, kuid me ootame, et selliseid programme on harva. Selliseid programme saab luua koos GOEXPERIMENT=noallocheaders, mis võimaldab naasta vanale metaandmete mudelile ja taastada eelneva joondamise käitumise, kuid paketihalduritel on soovitatav oma assembleri kood uuendada, et vältida joondamise eeldusi, kuna see lahendus eemaldatakse tulevases väljalaske.
- Nagu mainitud Go 1.20 väljalaske märkustes, nõuab Go 1.22 nüüd algset ehitust viimase versiooni Go 1.20 või uuema. Ootame, et Go 1.24 nõuab algset ehitust viimase versiooni Go 1.22 või uuema.
Originaal (go.dev)
Allikas: linux.org.ru
