È stato rilasciato il linguaggio di programmazione Go 1.22, in sviluppo da Google con la partecipazione della comunità, come soluzione ibrida che unisce l'alta performance dei linguaggi compilati con i vantaggi dei linguaggi di scripting, come la facilità di scrittura del codice, la rapidità di sviluppo e la robustezza contro gli errori. Il codice del progetto è distribuito sotto licenza BSD.
La sintassi di Go si basa su elementi familiari del linguaggio C con alcune introduzioni prese dal linguaggio Oberon. Il linguaggio è piuttosto conciso, ma il codice è facilmente leggibile e comprensibile. Il codice in Go viene compilato in file binari eseguibili separati, eseguiti nativamente, senza l'uso di una macchina virtuale (moduli di profiling, debugging e altri sotto-sistemi di rilevamento dei problemi vengono integrati come componenti runtime), il che consente di raggiungere prestazioni comparabili a programmi in C.
Il progetto è inizialmente sviluppato tenendo conto della programmazione concorrente e dell'efficiente funzionamento su sistemi multicore, fornendo anche strumenti implementati a livello di operatore per organizzare calcoli paralleli e interazioni tra metodi eseguiti in parallelo. Il linguaggio offre inoltre strumenti integrati di protezione contro l'uscita dalle aree ammissibili di blocchi di memoria e consente l'uso di un garbage collector.
Tra le novità del nuovo rilascio:
- Nei cicli "for" è stata aggiunta la supporto per la definizione di intervalli di numeri interi, ad esempio, per iterare valori da 0 a 9 ora si può usare il ciclo "for i := range 10 {…}".
- Nei cicli "for" è stata aggiunta una supporto sperimentale (GOEXPERIMENT=rangefunc) per le funzioni di definizione dell'intervallo, che consente di specificare una funzione come iteratore. Ad esempio, "for i, x := range slices.Backward(s) {…}".
- È stato risolto un problema di lunga data con i cicli "for", che portava alla condivisione delle variabili del ciclo tra diverse iterazioni al chiamare le goroutine. Ad esempio, il codice values := []string{"a", "b", "c"} for _, v := range values { go func() { fmt.Println(v) done <- true }() } ora stamperà "a", "b" e "c", e non solo "c" come avveniva prima.
- È stata ottimizzata la gestione della memoria nel runtime, che ha portato a un miglioramento delle prestazioni dell'1-3% e a una riduzione del consumo di memoria nella maggior parte delle applicazioni dell'1%.
- È proseguita l'attività di implementazione di ottimizzazioni nel compilatore basate su risultati di profilo del codice (PGO - ottimizzazione guidata da profilo), che consente di tenere conto delle caratteristiche definite durante l'esecuzione del programma. Nella nuova versione sono stati implementati nel compilatore strumenti di devirtualizzazione per sostituire le chiamate indirette ai vari metodi con l'esecuzione di blocchi inline espansi.
- Con l'attivazione di PGO, la modifica apportata ha consentito di aumentare le prestazioni della maggior parte dei programmi dal 2 al 14%.
- È stata aggiunta al compilatore un'implementazione sperimentale (GOEXPERIMENT=newinliner) migliorata del meccanismo di espansione (inlining) delle chiamate, che utilizza un'euristica per separare operazioni importanti da quelle secondarie.
- Nel pacchetto standard è stato aggiunto il pacchetto «math/rand/v2», che offre un'API più completa e utilizza algoritmi più veloci per la generazione di numeri pseudo-casuali.
- Nel pacchetto net/http.ServeMux è stata aggiunta la possibilità di specificare metodi e maschere nei modelli, ad esempio, il modello «GET /static/{id}/» verrà applicato alle richieste con metodo HTTP «GET» e manterrà il valore del secondo segmento del percorso richiesto nell'identificatore «id».
- Nel pacchetto database/sql è stata aggiunta la supporto per il tipo Null[T], che consente di eseguire la scansione di colonne che possono assumere il valore NULL. Nel pacchetto slices è stata aggiunta la funzione Concat per unire più slice di qualsiasi tipo.
- Nelle istruzioni per la gestione degli spazi di lavoro (collezioni di moduli) è stata fornita la possibilità di utilizzare la directory «vendor», contenente le dipendenze dal contenuto dello spazio di lavoro. La directory viene creata eseguendo il comando «go work vendor» e viene utilizzata nei comandi di compilazione quando si imposta l'opzione "-mod=vendor" (inclusa per impostazione predefinita in presenza della directory vendor).
Modifiche nel comportamento degli strumenti.
- go get non è più supportato al di fuori del modulo in modalità GOPATH obsoleta (cioè con GO111MODULE=off). Altri comandi di compilazione, come go build e go test, continueranno a funzionare per programmi GOPATH obsoleti per un periodo indefinito.
- go mod init non tenta più di importare i requisiti per i moduli dai file di configurazione di altri strumenti fornitori (come Gopkg.lock).
- go test -cover ora stampa un riepilogo della copertura per i pacchetti coperti che non hanno file di test propri. Fino a Go 1.22, go test -cover per un tale pacchetto riportava? mymod/mypack [no test files]
e ora, con Go 1.22, le funzioni nel pacchetto sono considerate non coperte: mymod/mypack coverage: 0.0% delle istruzioni. Si noti che se il pacchetto non contiene affatto codice eseguibile, non possiamo segnalare una percentuale significativa di copertura; per tali pacchetti, go test continuerà a riferire dell'assenza di file di test.
- L'interfaccia web dello strumento trace è stata leggermente aggiornata nell'ambito del supporto per il nuovo tracciatore, risolti alcuni problemi e migliorata la leggibilità di varie pagine. L'interfaccia web ora supporta l'esplorazione delle tracce in una visualizzazione orientata ai flussi. Lo strumento di visualizzazione delle tracce ora mostra anche la durata totale di tutte le chiamate di sistema. Questi miglioramenti si applicano solo alla visualizzazione delle tracce generate da programmi compilati con Go 1.22 o versioni successive. In una prossima versione, alcuni di questi miglioramenti saranno applicati alle tracce generate con versioni precedenti di Go.
- Il runtime ora memorizza i metadati della raccolta dei rifiuti basati sui tipi più vicino a ciascun oggetto della heap. Questa modifica riduce anche l'uso della memoria nella maggior parte dei programmi Go di circa l'1% grazie alla deduplicazione dei metadati ridondanti. In alcuni programmi, il miglioramento potrebbe essere minore, poiché questa modifica corregge i limiti della classe di dimensione dell'allocatore di memoria, quindi alcuni oggetti potrebbero essere spostati a una classe di dimensione superiore. Di conseguenza, gli indirizzi di alcuni oggetti che prima erano sempre allineati a un confine di 16 byte (o superiore) ora saranno allineati solo a un confine di 8 byte. Alcuni programmi che utilizzano istruzioni assembly che richiedono che gli indirizzi di memoria siano allineati a dimensioni maggiori di 8 byte e che si basano sul comportamento precedente dell'allineamento dell'allocatore di memoria potrebbero non funzionare, ma ci aspettiamo che tali programmi siano rari. Tali programmi possono essere creati con GOEXPERIMENT=noallocheaders con la possibilità di tornare al vecchio modello di metadati e ripristinare il precedente comportamento di allineamento, ma i proprietari dei pacchetti dovrebbero aggiornare il loro codice assembly per evitare assunzioni di allineamento, poiché questa soluzione alternativa sarà rimossa nella prossima versione.
- Come menzionato nelle note di rilascio di Go 1.20, Go 1.22 ora richiede la versione finale di Go 1.20 o successiva per la compilazione iniziale. Ci aspettiamo che Go 1.24 richieda la versione finale di Go 1.22 o successiva per la compilazione iniziale.
Originale (go.dev)
Fonte: linux.org.ru
