Predstavljen je izdanje programskega jezika Go 1.22, ki ga razvija podjetje Google v sodelovanju s skupnostjo kot hibridno rešitev, ki združuje visoko zmogljivost kompajliranih jezikov z blagodejnimi lastnostmi skriptnih jezikov, kot so enostavnost pisanja kode, hitrost razvoja in zaščita pred napakami. Koda projekta je licencirana pod licenco BSD.
Sintaksa Go se temelji na znanih elementih jezika C, s posameznimi prevzemi iz jezika Oberon. Jezik je dovolj jedrnat, vendar je koda lahko berljiva in razumljiva. Koda v jeziku Go se kompajlira v ločene binarne izvršljive datoteke, ki se izvajajo nativno, brez uporabe virtualnega stroja (moduli za profiliranje, odpravljanje napak in drugi podsystemski sistemi za odkrivanje težav se integrirajo kot runtime-komponente), kar omogoča dosego zmogljivosti, primerljive s programi v jeziku C.
Projekt je sprva razvijan ob upoštevanju večnitnega programiranja in učinkovitega delovanja na večjedrnih sistemih, vključno z zagotavljanjem sredstev na ravni operaterjev za organizacijo vzporednih izračunov in interakcijo med vzporedno izvajanimi metodami. Jezik prav tako zagotavlja vgrajena sredstva za zaščito pred dostopom izven dovoljenih območij dodeljenih blokov pomnilnika in omogoča uporabo zbiralnika smeti.
Med spremembami v novi izdaji:
- V zanke 'for' je dodana podpora za določanje obsegov celih števil, na primer, za obhod vrednosti od 0 do 9 lahko uporabite zanko 'for i := range 10 {…}'.
- V zanke 'for' je dodana eksperimentalna (GOEXPERIMENT=rangefunc) podpora za funkcije za določanje obsega, ki omogoča navajanje funkcije kot iteratiorja. Na primer, 'for i, x := range slices.Backward(s) {…}'.
- Rešena je bila dolgotrajna težava z zankami 'for', ki je pri klicu sočasnih programov (goroutine) povzročala skupno rabo spremenljivk zanke v različnih iteracijah. Na primer, koda values := []string{"a", "b", "c"} for _, v := range values { go func() { fmt.Println(v) done <- true }() } bo zdaj izpisovala 'a', 'b' in 'c', ne samo 'c', kot je bilo prej.
- Izvedena je optimizacija upravljanja memorijom u runtime-u, što je dovelo do povećanja performansi od 1-3% i smanjenja potrošnje memorije u većini aplikacija za 1%.
- Nastavljeni su radovi na implementaciji optimizacija u prevodilac na osnovu rezultata profiliranja koda (PGO — optimizacija vođena profilisanjem), koje omogućavaju uzimanje u obzir karakteristika definisanih tokom izvođenja programa. U novoj verziji dodatni su alati za devirtualizaciju u prevodiocu koji zamenjuju indirektne pozive raznih metoda izvršavanjem razvijenih inline blokova.
- Uključivanjem PGO, dodata promena je omogućila povećanje performansi većine programa od 2-14%.
- U prevodilac je dodana eksperimentalna (GOEXPERIMENT=newinliner) unapređena realizacija mehanizma razvijanja (inlining) poziva, koja koristi heuristiku za razdvajanje važnih i sporednih operacija.
- U standardnu biblioteku je dodat paket „math/rand/v2“, koji nudi celovitiji API i koristi brže algoritme za generisanje pseudo-slučajnih brojeva.
- U paket net/http.ServeMux dodata je mogućnost navođenja metoda i maski u šablonima, na primer, šablon „GET /static/{id}/“ će se primeniti na zahteve sa HTTP metodom „GET“ i sačuvati vrednost drugog segmenta zahtevanog puta u identifikatoru „id“.
- U paket database/sql dodata je podrška za tip Null[T], koji omogućava skeniranje kolona koje mogu imati vrednost NULL. U paket slices dodata je funkcija Concat za spajanje više slice-ova bilo kog tipa.
- U komandama za rad sa radnim prostorima (kolekcijama modula) omogućena je upotreba direktorijuma „vendor“, koji sadrži zavisnosti na sadržaj radnog prostora. Direktorijum se kreira prilikom izvršavanja komande „go work vendor“ i koristi se u kompilacijskim komandom pri postavljanju opcije "-mod=vendor" (između ostalog uključuje se podrazumevano kada postoji direktorijum vendor).
Promene u ponašanju alata.
- go get više nije podržan van modula u zastarjelom GOPATH režimu (tj. sa GO111MODULE=off). Druge komande za kompilaciju, kao što su go build i go test, nastaviće da rade za zastarele GOPATH programe tokom neodređenog vremena.
- go mod init više ne pokušava da uveze zahteve za module iz konfiguracionih datoteka drugih dobavljača alata (poput Gopkg.lock).
- go test -cover zdaj natisne povzetek podatkov o pokritosti za pakete, ki nimajo lastnih testnih datotek. Pred Go 1.22 je go test -cover za to vrsto paketa poročal? mymod/mypack [ni testnih datotek]
in zdaj z Go 1.22 funkcije v paketu veljajo za nepokrite: mymod/mypack coverage: 0.0% izjav. Upoštevajte: če paket sploh ne vsebuje izvršljive kode, ne moremo poročati o pomembnem procentu pokritosti; za takšne pakete bo go test še naprej poročal o pomanjkanju testnih datotek.
- Spletni vmesnik orodja trace je bil nekoliko posodobljen v okviru dela na podpori novega sledenja, rešeni so bili nekateri problemi in izboljšana berljivost različnih strani. Spletni vmesnik zdaj podpira raziskovanje sledi v pogledu, usmerjenem v tok. Orodje za ogled sledi zdaj tudi prikazuje skupno trajanje vseh sistemskih klicev. Te izboljšave so uporabne samo za ogled sledi, ustvarjenih s programi, ustvarjenimi v Go 1.22 ali novejši različici. V prihodnji izdaji bodo nekatere od teh izboljšav vključene v sledi, ustvarjene s starejšimi različicami Go.
- Izvedbena sredina sedaj shranjuje metapodatke o zbirki smeti na podlagi tipov bližje vsakemu objektu na kupu. Ta sprememba prav tako zmanjša stroške pomnilnika večine programov Go za približno 1 % z deduplikacijo odvečnih metapodatkov. V nekaterih programih je izboljšanje lahko manjše, ker ta sprememba popravi meje razreda velikosti dodeljevanja pomnilnika, zato so lahko nekateri objekti premaknjeni v razred velikosti višje. Posledica te spremembe je, da so naslovi nekaterih objektov, ki so prej vedno bili poravnani na meji 16 bajtov (ali višje), zdaj poravnani le še na meji 8 bajtov. Nekateri programi, ki uporabljajo assembler ukaze, ki zahtevajo, da so naslovi pomnilnika poravnani na velikost nad 8 bajtov in se zanašajo na prejšnje obnašanje poravnavanja dodeljevanja pomnilnika, lahko prenehajo delovati, vendar pričakujemo, da bodo takšni programi redki. Ti programi se lahko ustvarijo z GOEXPERIMENT=noallocheaders s možnostjo vrnitve na staro različico metapodatkov in obnovitvijo prejšnjega obnašanja poravnavanja, vendar naj lastniki paketov posodobijo svoj assembler kodo, da se izognejo predpostavkam o poravnavi, saj bo ta zaobhodna pot odstranjena v prihodnjih izdajah.
- Kot je omenjeno v opombah k izdaji Go 1.20, Go 1.22 zdaj zahteva končno različico Go 1.20 ali novejšo za začetno sestavljanje. Pričakujemo, da bo Go 1.24 zahteval končno različico Go 1.22 ali novejšo za začetno sestavljanje.
Izvor (go.dev)
Izvor: linux.org.ru
