Dopo sei mesi di sviluppo, è stato rilasciato il linguaggio di programmazione Go 1.23, sviluppato da Google con il contributo della comunità, come una 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 la licenza BSD.
La sintassi di Go si basa su elementi familiari del linguaggio C, con alcune influenze dal linguaggio Oberon. Il linguaggio è abbastanza conciso, ma il codice è facilmente leggibile e comprensibile. Il codice scritto in Go viene compilato in file binari eseguibili autonomi, eseguiti nativamente senza l'uso di una macchina virtuale (i moduli di profiling, debugging e altre sottosistemi di rilevamento dei problemi sono integrati come componenti runtime), il che consente di raggiungere prestazioni comparabili a quelle dei programmi scritti in C.
Il progetto è stato inizialmente sviluppato tenendo conto della programmazione multithreading e dell'efficiente utilizzo di sistemi multicore, fornendo anche strumenti implementati a livello di operatore per organizzare calcoli paralleli e interazioni tra metodi eseguiti in parallelo. Il linguaggio offre anche strumenti integrati per proteggere dalla fuga di memoria e garantisce la possibilità di utilizzare un garbage collector.
Tra le novità della nuova versione:
- Nei cicli «for», nella definizione degli intervalli di valori, è stata aggiunta la possibilità di specificare una funzione come argomento dell'espressione «range», per utilizzare questa funzione come iteratore, consentendo di creare iteratori personalizzati per ogni sequenza. È possibile specificare funzioni dei seguenti tipi: func(func() bool), func(func(K) bool) e func(func(K, V) bool). È stato aggiunto un nuovo pacchetto iter, che fornisce operazioni di base per l'organizzazione dell'iterazione delle sequenze. Inoltre, nei pacchetti slices e maps sono state aggiunte nuove funzionalità per lavorare con gli iteratori. Ad esempio, per iterare le chiavi di un array associativo in ordine ordinato, ora è possibile specificare «for i, x := range slices.Sorted(maps.Keys(m)) {…}».
- È stata aggiunta la prima supporto (attivabile tramite GOEXPERIMENT=aliastypeparams) per l'utilizzo di alias di tipo con i propri parametri nelle funzioni generali (generics), che consentono di creare funzioni per lavorare con più tipi contemporaneamente.
- Nell'ambiente di sviluppo è stata integrata la possibilità di inviare telemetria a un server telemetry.go.dev. La telemetria viene memorizzata in file locali, disponibili per la revisione, e copre solo i dati sulle caratteristiche di utilizzo dell'ambiente di sviluppo (la telemetria non viene aggiunta alle applicazioni utente raccolte tramite l'ambiente di sviluppo). Per impostazione predefinita, l'invio della telemetria a un server esterno è disattivato (opt-in) e richiede attivazione tramite il nuovo comando «go telemetry on». L'invio della telemetria aiuterà a identificare anomalie e comportamenti errati, valutare le interazioni degli sviluppatori con l'ambiente di sviluppo e capire quali opzioni sono più richieste e quali sono praticamente inutilizzate. Si prevede che le statistiche accumulate consentano di aggiornare l'ambiente di sviluppo, aumentando l'efficienza e la praticità del lavoro.

- È stato aggiunto il comando «go env -changed» per visualizzare solo le impostazioni i cui valori differiscono dai valori predefiniti.
- È stato aggiunto il comando «go mod tidy -diff», che consente di visualizzare le modifiche in formato patch differenziale invece di effettuare modifiche nei file.
- È stata aggiunta un'analisi delle versioni al comando «go vet», che indica gli elementi troppo nuovi per essere utilizzati nella versione di Go selezionata. Ad esempio, l'analizzatore emetterà un avviso per l'uso della funzione reflect.TypeFor, che è apparsa nella versione 1.22, quando si tenta di utilizzarla in un modulo che dichiara supporto per la versione 1.21.
- Migliorata l'implementazione dei tipi time.Timer e time.Ticker, con modifiche relative alla memorizzazione e all'ottimizzazione della raccolta di rifiuti.
- È stato aggiunto il pacchetto structs, che definisce i tipi per modificare le proprietà delle strutture.
- È stato aggiunto il pacchetto unique con funzioni per la canonizzazione dei valori comparabili.
- Nei file go.mod e go.work è stato aggiunto il supporto per la direttiva godebug per gestire il debug.
- È stata aggiunta la supporto sperimentale per OpenBSD su sistemi RISC-V a 64 bit (openbsd/riscv64). Migliorato il supporto per Linux, macOS, ARM64, RISC-V e WASI.
- Migliorata la prestazione sulle architetture i386 e amd64 con l'attivazione dell'ottimizzazione basata sui risultati della profilazione del codice (PGO — Profile-guided optimization), che consente di tenere conto delle caratteristiche definite durante l'esecuzione del programma.
Fonte: opennet.ru

