Rilascio di Go 1.22

È stato rilasciato il linguaggio di programmazione Go 1.22, sviluppato da Google con il supporto della comunità come soluzione ibrida che combina l'alta prestazione dei linguaggi compilati con i vantaggi dei linguaggi di scripting, come la facilità di scrittura del codice, la rapidità di sviluppo e la protezione dagli errori. Il codice del progetto è distribuito sotto licenza BSD.

La sintassi di Go è basata su elementi familiari del linguaggio C con alcuni prestiti dal linguaggio Oberon. Il linguaggio è abbastanza conciso, ma il codice è facilmente leggibile e comprensibile. Il codice scritto in Go è compilato in file eseguibili binari autonomi, eseguiti in modo nativo senza l'uso di una macchina virtuale (moduli di profilazione, debuggers e altri sistemi per l'identificazione dei problemi durante l'esecuzione sono integrati come componenti runtime), il che permette di raggiungere prestazioni paragonabili ai programmi scritti in C.

Il progetto è stato originariamente sviluppato tenendo conto della programmazione multithread e dell'efficiente funzionamento su sistemi multicore, fornendo strumenti implementati a livello di operatore per organizzare calcoli paralleli e interazione tra metodi eseguiti in parallelo. Il linguaggio offre anche strumenti integrati di protezione contro l'uscita dalle aree consentite dei blocchi di memoria e consente l'uso di un garbage collector.

Tra le novità della nuova versione:

  • 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ò utilizzare 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) {...}»
  • È stata risolta una vecchia problematica con i cicli «for», che causava, durante la chiamata di goroutine, la condivisione delle variabili di ciclo tra le diverse iterazioni. Ad esempio, il codice values := []string{"a", "b", "c"} for _, v := range values { go func() { fmt.Println(v) done <- true }() } ora restituirà «a», «b» e «c», e non solo «c» come prima.
  • È stata ottimizzata la gestione della memoria nel runtime, con un aumento delle prestazioni dell'1-3% e una diminuzione del consumo di memoria nella maggior parte delle applicazioni dell'1%.
  • È proseguito il lavoro per l'implementazione di ottimizzazioni nel compilatore basate sui risultati del profiling del codice (PGO — ottimizzazione guidata dal profiling), che consentono di tenere conto delle caratteristiche definite durante l'esecuzione del programma. Nella nuova versione, il compilatore utilizza strumenti di devirtualizzazione per sostituire le chiamate indirette a vari metodi con l'esecuzione di blocchi inline espansi.
  • Con l'attivazione del PGO, la modifica aggiunta ha consentito un aumento delle prestazioni nella maggior parte dei programmi dal 2 al 14%.
  • Nel compilatore è stata aggiunta un'implementazione sperimentale (GOEXPERIMENT=newinliner) migliorata del meccanismo di inlining delle chiamate, che utilizza un'euristica per separare operazioni importanti da quelle secondarie.
  • È stato aggiunto il pacchetto «math/rand/v2» alla libreria standard, che offre un'API più coerente e utilizza algoritmi di generazione di numeri pseudo-casuali più veloci.
  • 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 il metodo HTTP «GET» e conserverà 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 scansionare colonne che possono assumere il valore NULL. Nel pacchetto slices è stata aggiunta la funzione Concat per unire più slice di qualsiasi tipo.
  • Nelle squadre per lavorare con gli spazi di lavoro (collezioni di moduli) è stata fornita la possibilità di utilizzare la cartella «vendor», che contiene le dipendenze del contenuto dello spazio di lavoro. La cartella viene creata quando si esegue il comando «go work vendor» e viene utilizzata nei comandi di build con l'opzione "-mod=vendor" (inclusa per impostazione predefinita in presenza della cartella vendor).

Modifiche nel comportamento degli strumenti.

  • go get non è più supportato al di fuori del modulo nella modalità GOPATH obsoleta (cioè con GO111MODULE=off). Altri comandi di build, come go build e go test, continueranno a funzionare per i programmi GOPATH obsoleti per un tempo indefinito.
  • go mod init non tenta più di importare i requisiti dei 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 tale pacchetto segnalerebbe? mymod/mypack [no test files]

    ora con Go 1.22, le funzioni nel pacchetto sono considerate non coperte: mymod/mypack coverage: 0.0% delle dichiarazioni. Si prega di notare che se il pacchetto non contiene alcun codice eseguibile, non possiamo segnalare una percentuale significativa di copertura; per tali pacchetti, go test continuerà a segnalare l'assenza di file di test.

  • L'interfaccia web dello strumento trace è stata leggermente aggiornata per supportare il nuovo tracciatore, risolvendo alcuni problemi e migliorando la leggibilità di varie pagine. L'interfaccia ora supporta l'esplorazione delle tracce in una vista orientata ai flussi. Il visualizzatore 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 un futuro rilascio, alcuni di questi miglioramenti saranno applicati alle tracce create con versioni precedenti di Go.
  • L'ambiente di esecuzione ora memorizza i metadati della raccolta dei rifiuti in base ai tipi più vicini a ciascun oggetto nell'heap. Questa modifica riduce anche il consumo di memoria della 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 confini 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 in precedenza erano sempre allineati al confine di 16 byte (o superiore) ora saranno allineati solo al confine di 8 byte. Alcuni programmi che utilizzano istruzioni assembler che richiedono che gli indirizzi di memoria siano allineati a dimensioni superiori a 8 byte e si basano sul precedente comportamento di allineamento dell'allocatore di memoria potrebbero guastarsi, ma ci aspettiamo che tali programmi siano rari. Tali programmi possono essere creati impostando 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 proprio codice assembler per evitare di presumere l'allineamento, poiché questa soluzione 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 build iniziale. Ci aspettiamo che Go 1.24 richieda la versione finale di Go 1.22 o successiva per la build iniziale.
    Originale (go.dev)

Fonte: linux.org.ru

Acquista un hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista un hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster