Cosa c'è di Nuovo in Go 1.24?
Go 1.24 si sta delineando come una release significativa, introducendo una serie di miglioramenti focalizzati su prestazioni, sicurezza ed esperienza dello sviluppatore. Questi cambiamenti mirano a rendere Go ancora più potente ed efficiente per la costruzione di applicazioni moderne.
Potenziamento delle Prestazioni (Performance Boost)
Un miglioramento generale delle prestazioni con una riduzione del 2-3% dell'overhead della CPU su una suite di benchmark rappresentativi. Questi miglioramenti includono una nuova implementazione di mappe integrata (built-in map implementation), un'allocazione di memoria più efficiente per oggetti di piccole dimensioni e una nuova implementazione di mutex interna al runtime. I risultati possono variare a seconda dell'applicazione.
Crittografia Post-Quantistica (Post-Quantum Crypto)
Introduzione del pacchetto 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 per il futuro della sicurezza crittografica.
Miglioramento TLS (TLS Enhancement)
Supporto per Encrypted Client Hello (ECH) in TLS. Questa funzionalità può essere abilitata popolando il campo Config.EncryptedClientHelloKeys
, migliorando la privacy e la sicurezza per le connessioni TLS.
Nuova Mappa Swiss Table (New Swiss Table Map)
Un'implementazione di mappe migliorata per prestazioni superiori. Questa nuova implementazione si basa sulle Swiss Tables e può essere disabilitata con il flag di compilazione GOEXPERIMENT=noswissmap
.
Aggiornamento Sync Map (Sync Map Update)
Prestazioni migliorate per le modifiche alle mappe in sync.Map
. Le modifiche di insiemi disgiunti di chiavi hanno molte meno probabilità di contendere su mappe più grandi e non è più richiesto alcun tempo di "ramp-up" per raggiungere carichi a bassa contesa dalla mappa. Se si riscontrano problemi, è possibile tornare alla vecchia implementazione utilizzando GOEXPERIMENT=nosynchashtriemap
.
Marshaling JSON Migliorato (Enhanced JSON Marshaling)
Una nuova opzione di tag omitempty
per un'omissione più intelligente dei campi struct durante il marshaling JSON. Durante il marshaling, un campo struct con l'opzione omitempty
verrà omesso se il suo valore è zero. Se il tipo di campo ha un metodo IsZero() bool
, questo verrà utilizzato per determinare se il valore è zero.
Pulizia del Runtime (Runtime Cleanup)
Introduzione della funzione AddCleanup
per sostituire SetFinalizer
per una migliore gestione delle risorse. A differenza di SetFinalizer
, essa non resuscita l'oggetto a cui è allegata per la finalizzazione, e più operazioni di pulizia possono essere allegate a un singolo oggetto. Il nuovo codice dovrebbe preferire AddCleanup
a SetFinalizer
.
Direttive Strumento in go.mod (Tool Directives in go.mod)
Tracciamento migliorato delle dipendenze degli eseguibili utilizzando le direttive strumento in go.mod
. Ciò elimina la necessità della precedente soluzione temporanea di aggiungere strumenti come importazioni vuote a un file convenzionalmente denominato "tools.go".
Accesso Limitato alla Directory (Directory-Limited Access)
Nuovo tipo os.Root
per operazioni controllate sul filesystem. Il tipo os.Root
fornisce la capacità di eseguire operazioni sul filesystem all'interno di una directory specifica, prevenendo l'accesso al di fuori del percorso specificato.
Miglioramenti al Testing (Testing Improvements)
Nuovo pacchetto testing/synctest
per il testing 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 pacchetto è sperimentale e deve essere abilitato impostando GOEXPERIMENT=synctest
al momento della compilazione.
Cache di Compilazione (Build Cache)
Gli eseguibili di go run
sono ora memorizzati nella cache per un'esecuzione più rapida. Ciò rende le esecuzioni ripetute più veloci a spese di un ingrandimento della cache.
Prestazioni Cgo (Cgo Performance)
Nuove annotazioni #cgo noescape
e #cgo nocallback
per migliori prestazioni Cgo. #cgo noescape cFunctionName
indica al compilatore che la memoria passata alla funzione C non "escape" (non fuoriesce). #cgo nocallback cFunctionName
indica al compilatore che la funzione C non richiama (call back) alcuna funzione Go.
Puntatori Deboli (Weak Pointers)
Supporto per i puntatori deboli per fare riferimento in modo sicuro alla memoria senza prevenirne 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 canonizzazione e vari tipi di cache.
Miglioramento del Benchmark (Benchmark Improvement)
Nuovo metodo testing.B.Loop
per benchmark più veloci e meno soggetti a errori. La funzione di benchmark verrà eseguita esattamente una volta per -count
, quindi i passaggi costosi di setup e cleanup vengono eseguiti solo una volta. I parametri delle chiamate di funzione e i risultati vengono mantenuti in vita, impedendo al compilatore di ottimizzare completamente il corpo del loop.
Go 1.24 si sta delineando come una release significativa, offrendo miglioramenti sostanziali in vari aspetti del linguaggio e del suo ecosistema.