Panoramica della versione Go 1.24: Mappe Swiss Table, ML-KEM, os.Root e testing/synctest

Go 1.24 si preannuncia come una versione significativa, introducendo una serie di miglioramenti incentrati su prestazioni, sicurezza ed esperienza dello sviluppatore. Queste modifiche mirano a rendere Go ancora più potente ed efficiente per la costruzione di applicazioni moderne.
Miglioramento delle prestazioni
Un miglioramento generale delle prestazioni, con una riduzione del 2-3% del sovraccarico della CPU su una serie di benchmark rappresentativi. Questi miglioramenti includono una nuova implementazione integrata delle mappe, un'allocazione di memoria più efficiente per oggetti di piccole dimensioni e una nuova implementazione interna del mutex del runtime. I risultati possono variare a seconda dell'applicazione.
Crittografia post-quantistica
Introduzione del package crypto/mlkem, che implementa ML-KEM-768 e ML-KEM-1024. ML-KEM è un meccanismo di scambio di chiavi post-quantistico precedentemente noto come Kyber e specificato in FIPS 203. Questa aggiunta prepara Go al futuro della sicurezza crittografica.
Miglioramento di TLS
Supporto per Encrypted Client Hello (ECH) in TLS. Questa funzionalità può essere abilitata popolando il campo Config.EncryptedClientHelloKeys, migliorando la riservatezza e la sicurezza delle connessioni TLS.
Nuova mappa Swiss Table
Una implementazione delle mappe migliorata per prestazioni superiori. Questa nuova implementazione è basata su Swiss Tables e può essere disabilitata tramite il flag di build GOEXPERIMENT=noswissmap.
Aggiornamento di sync.Map
Prestazioni migliorate per le modifiche alle mappe in sync.Map. Le modifiche su insiemi disgiunti di chiavi hanno molta meno probabilità di entrare in contesa su mappe più grandi, e non è più richiesto alcun tempo di avvio graduale per ottenere carichi a bassa contesa dalla mappa. In caso di problemi, è possibile ripristinare la vecchia implementazione utilizzando GOEXPERIMENT=nosynchashtriemap.
Marshaling JSON migliorato
Una nuova opzione di tag omitempty per un'omissione più intelligente dei campi delle struct durante il marshaling JSON. Durante il marshaling, un campo di struct con l'opzione omitempty viene omesso se il suo valore è zero. Se il tipo del campo dispone di un metodo IsZero() bool, questo viene utilizzato per determinare se il valore è zero.
Pulizia del runtime
Introduzione della funzione AddCleanup per sostituire SetFinalizer al fine di una migliore gestione delle risorse. A differenza di SetFinalizer, non riporta in vita l'oggetto a cui è associata per la finalizzazione, e più cleanup possono essere associati a un singolo oggetto. Il nuovo codice dovrebbe preferire AddCleanup a SetFinalizer.
Direttive degli strumenti in go.mod
Miglioramento del tracciamento delle dipendenze eseguibili tramite le direttive degli strumenti (tool directives) in go.mod. Questo elimina la necessità del precedente workaround, che consisteva nell'aggiungere gli strumenti come import vuoti in un file convenzionalmente denominato “tools.go”.
Accesso limitato a una directory
Nuovo tipo os.Root per operazioni controllate sul filesystem. Il tipo os.Root consente di eseguire operazioni sul filesystem all'interno di una specifica directory, impedendo l'accesso al di fuori del percorso indicato.
Miglioramenti ai test
Nuovo package testing/synctest per il test di codice concorrente. La funzione synctest.Run avvia un gruppo di goroutine in una “bolla” isolata, e la funzione synctest.Wait attende che tutte le goroutine nella bolla corrente si blocchino. Questo package è sperimentale e deve essere abilitato impostando GOEXPERIMENT=synctest al momento della build.
Cache di build
Gli eseguibili di go run sono ora memorizzati nella cache per un'esecuzione più rapida. Questo rende le esecuzioni ripetute più veloci a scapito di una cache di dimensioni maggiori.
Prestazioni di Cgo
Nuove annotazioni #cgo noescape e #cgo nocallback per prestazioni migliori di Cgo. #cgo noescape cFunctionName indica al compilatore che la memoria passata alla funzione C non sfugge. #cgo nocallback cFunctionName indica al compilatore che la funzione C non richiama alcuna funzione Go.
Puntatori deboli
Supporto per i puntatori deboli (weak pointers) per referenziare in modo sicuro la memoria senza impedirne il recupero. I puntatori deboli sono una primitiva di basso livello, fornita per consentire la creazione di strutture efficienti in termini di memoria, come mappe deboli per associare valori, mappe di canonicalizzazione e diversi tipi di cache.
Miglioramento dei benchmark
Nuovo metodo testing.B.Loop per benchmark più rapidi e meno soggetti a errori. La funzione di benchmark viene eseguita esattamente una volta per ciascun -count, quindi le fasi di setup e cleanup costose vengono eseguite una sola volta. I parametri e i risultati delle chiamate di funzione vengono mantenuti attivi, impedendo al compilatore di ottimizzare completamente via il corpo del ciclo.
Go 1.24 si preannuncia come una versione significativa, offrendo miglioramenti sostanziali in vari aspetti del linguaggio e del suo ecosistema.
