A fost lansată versiunea 1.22 a limbajului de programare Go, dezvoltat de Google cu sprijinul comunității, ca o soluție hibridă care combină performanța ridicată a limbajelor compilate cu avantajele limbajelor script, precum ușurința scrierii codului, rapiditatea dezvoltării și protecția împotriva erorilor. Codul proiectului este distribuit sub licența BSD.
Sintaxa Go se bazează pe elemente familiare din limbajul C, cu unele împrumuturi din limbajul Oberon. Limbajul este destul de concis, dar codul este ușor de citit și de înțeles. Codul scris în Go este compilat în fișiere executabile binare separate, care rulează nativ, fără utilizarea unei mașini virtuale (modulele de profilare, depanare și alte subsisteme pentru identificarea problemelor sunt integrate sub formă de componente runtime), permițând obținerea unei performanțe comparabile cu programele scrise în C.
Proiectul este dezvoltat inițial având în vedere programarea concurentă și funcționarea eficientă pe sisteme multicore, oferind inclusiv instrumente implementate la nivel de operatori pentru organizarea calculului paralel și interacțiunea între metodele care rulează în paralel. Limbajul oferă de asemenea instrumente integrate de protecție împotriva ieșirilor din zonele autorizate ale blocurilor de memorie și permite utilizarea unui colector de gunoi.
Printre modificările din noua versiune:
- În buclele "for" a fost adăugată suportul pentru definirea intervalelor de numere întregi, de exemplu, pentru a itera valori de la 0 la 9 acum se poate folosi bucla "for i := range 10 {…}".
- În buclele "for" a fost adăugat suport experimental (GOEXPERIMENT=rangefunc) pentru funcțiile de definire a intervalelor, care permite specificarea unei funcții ca iterator. De exemplu, "for i, x := range slices.Backward(s) {…}".
- A fost rezolvată o problemă de lungă durată cu buclele "for", care ducea la utilizarea simultană a variabilelor de ciclu în iterații diferite atunci când erau apelate corutine (goroutine). De exemplu, codul values := []string{"a", "b", "c"} for _, v := range values { go func() { fmt.Println(v) done <- true }() } acum va afișa "a", "b" și "c", nu doar "c" cum se întâmpla anterior.
- A fost optimizată gestionarea memoriei în runtime, ceea ce a dus la o îmbunătățire a performanței de 1-3% și la o reducere a consumului de memorie în majoritatea aplicațiilor cu 1%.
- Continuarea lucrărilor pentru integrarea optimizărilor în compilator bazate pe rezultatele profilării codului (PGO - optimizare bazată pe profil), care permit luarea în considerare a caracteristicilor definite în timpul execuției programului. În noua versiune, compilatorul utilizează tehnici de devirtualizare pentru a înlocui apelurile indirecte ale diferitelor metode cu execuția blocurilor inline desfășurate.
- Activarea PGO a dus la o creștere a performanței pentru majoritatea programelor de 2-14%.
- Compilatorul a adăugat o implementare experimentală (GOEXPERIMENT=newinliner) a mecanismului îmbunătățit de desfășurare (inlining) a apelurilor, folosind o heuristică pentru a separa operațiile importante de cele secundare.
- Biblioteca standard a fost extinsă cu pachetul „math/rand/v2”, care oferă o API mai coerentă și folosesc algoritmi mai rapizi pentru generarea numerelor pseudo-aleatoare.
- Pachetul net/http.ServeMux a fost îmbogățit cu posibilitatea de a specifica metode și masca în șabloane; de exemplu, șablonul „GET /static/{id}/” va fi aplicat cererilor cu metoda HTTP „GET” și va păstra valoarea celui de-al doilea segment al căii solicitate în identificatorul „id”.
- Pachetul database/sql adaugă suport pentru tipul Null[T], care permite scanarea coloanelor ce pot accepta valoarea NULL. Pachetul slices a adăugat o funcție Concat pentru îmbinarea mai multor slice-uri de orice tip.
- În comenzile pentru gestionarea spațiilor de lucru (colecțiile de module) a fost oferită posibilitatea de a folosi directorul „vendor”, care conține dependențele conținutului spațiului de lucru. Directorul este creat atunci când se execută comanda „go work vendor” și este utilizat în comenzile de compilare atunci când se setează opțiunea "-mod=vendor" (activată implicit în prezența directorului vendor).
Modificări în comportamentul utilitarelor.
- go get nu mai este acceptat în afara modulului în modul deprecated GOPATH (adică cu GO111MODULE=off). Alte comenzi de compilare, cum ar fi go build și go test, vor continua să funcționeze pentru programele GOPATH dezactivate pentru o perioadă nedefinită.
- go mod init nu mai încearcă să importe cerințele modulului din fișierele de configurare pentru alte instrumente de furnizare (precum Gopkg.lock).
- comanda go test -cover acum afișează un sumar al datelor de acoperire pentru pachetele acoperite care nu au fișiere de test proprii. Până la Go 1.22, comanda go test -cover pentru un astfel de pachet ar fi raportat? mymod/mypack [no test files]
iar acum, cu Go 1.22, funcțiile din pachet sunt considerate neacoperite: mymod/mypack coverage: 0.0% din instrucțiuni. Vă rugăm să rețineți: dacă un pachet nu conține deloc cod executabil, nu putem raporta un procent semnificativ de acoperire; pentru astfel de pachete, comanda go test va continua să raporteze lipsa fișierelor de test.
- Interfața web a instrumentului trace a fost ușor actualizată în cadrul muncii de suport pentru noul trasor, rezolvându-se unele probleme și îmbunătățind citibilitatea diferitelor pagini. Interfața web suportă acum explorarea trasărilor într-o formă orientată pe flux. Vizualizatorul de trasări afișează acum și durata totală a tuturor apelurilor de sistem. Aceste îmbunătățiri se aplică doar pentru vizualizarea trasărilor create de programe construite pe Go 1.22 sau mai recent. Într-o viitoare versiune, unele dintre aceste îmbunătățiri vor fi integrate în trasările create de versiuni mai vechi de Go.
- Mediul de execuție acum stochează metadatele pentru colectarea deșeurilor bazate pe tipuri mai aproape de fiecare obiect din heap. Această modificare reduce, de asemenea, costurile de memorie ale majorității programelor Go cu aproximativ 1% prin deduplicarea metadatelor redundante. În unele programe, îmbunătățirea poate fi mai mică, deoarece această modificare corectează limitele clasei de dimensiune a allocatorului de memorie, astfel încât unele obiecte pot fi mutate într-o clasă de dimensiune superioară. Ca urmare a acestei modificări, adresele unor obiecte care erau anterior întotdeauna aliniate pe o margine de 16 octeți (sau mai mare) vor fi acum aliniate doar pe o margine de 8 octeți. Unele programe care utilizează instrucțiuni de asamblare care necesită ca adresele de memorie să fie aliniate pe dimensiuni mai mari de 8 octeți și se bazează pe comportamentul anterior de aliniere al allocatorului de memorie pot ieși din funcțiune, dar ne așteptăm ca astfel de programe să fie rare. Aceste programe pot fi create cu GOEXPERIMENT=noallocheaders având posibilitatea de a reveni la modelul anterior de metadate și de a restabili comportamentul anterior de aliniere, dar proprietarii de pachete ar trebui să își actualizeze codul de asamblare pentru a evita presupunerile despre aliniere, deoarece această ocolire va fi eliminată în viitoarele versiuni.
- Așa cum a fost menționat în notele de lansare Go 1.20, Go 1.22 necesită acum versiunea finală Go 1.20 sau mai recentă pentru construirea inițială. Ne așteptăm ca Go 1.24 să necesite versiunea finală Go 1.22 sau o versiune mai recentă pentru construirea inițială.
Original (go.dev)
Sursa: linux.org.ru
