Il team di Golang ha appena rilasciato la prima release candidate di Go 1.24, e come sviluppatore, devo dire che le novità sono davvero interessanti. Analizziamo insieme le caratteristiche più rilevanti di questa versione.
Miglioramenti delle Performance
Il primo aspetto che salta all’occhio è un incremento generale delle performance del 2-3%. Questo miglioramento è dovuto principalmente a tre fattori:
- Una nuova implementazione delle mappe basata su Swiss Tables
- Un’allocazione più efficiente degli oggetti di piccole dimensioni
- Una nuova implementazione del mutex interno al runtime
Inoltre, sono state introdotte due nuove direttive cgo (noescape
e nocallback
) che potrebbero ridurre significativamente l’overhead nelle chiamate da Go a codice C.
Weak Pointers: Finalmente!
Una delle novità più attese è l’implementazione dei weak pointers. Per chi non lo sapesse, un weak pointer è un riferimento a un oggetto che non impedisce al garbage collector di eliminarlo. L’implementazione si presenta come weak.Pointer[T]
, che rispecchia elegantemente la sintassi di atomic.Pointer[T]
già esistente.
import "weak"
type Cache struct {
data weak.Pointer[Data]
}
Questa funzionalità, insieme al pacchetto unique
introdotto in Go 1.23, apre nuove possibilità per ottimizzare l’utilizzo della memoria nelle applicazioni Go.
Crittografia Post-Quantum
Un’aggiunta particolarmente importante riguarda il supporto alla crittografia post-quantum nel pacchetto crypto/tls
. La libreria standard ora include ML-KEM (precedentemente noto come Kyber), specificato in FIPS 203. Questa implementazione è fondamentale per preparare le applicazioni alle sfide della sicurezza nell’era dei computer quantistici.
Encrypted Client Hello (ECH)
È stata introdotta la funzionalità ECH nel pacchetto crypto/tls
. Questa tecnologia risolve una vulnerabilità storica del TLS: mentre la comunicazione è cifrata, l’identità del server rimaneva visibile. ECH utilizza una chiave pubblica distribuita via DNS e ottenuta tramite DNS-over-HTTPS per cifrare il primo contatto del client.
Miglioramenti in encoding/json
Una novità molto attesa è l’introduzione del tag omitzero
nel pacchetto encoding/json
. Questo risolve alcune limitazioni storiche del tag omitempty
, fornendo un comportamento più coerente con la definizione di zero value in Go.
type Esempio struct {
// Campo omesso se è zero value
Campo1 int `json:"campo1,omitzero"`
// Campo omesso se è vuoto (comportamento precedente)
Campo2 []string `json:"campo2,omitempty"`
}
Differenze chiave tra omitempty e omitzero:
omitempty
omette campi con valori vuoti (false, 0, puntatori nil, slice vuote, ecc.)omitzero
omette solo i campi con il loro zero value secondo la definizione di Go
Nuova Direttiva tool in go.mod
È stata aggiunta una nuova direttiva tool
nel file go.mod, che semplifica la gestione delle dipendenze per gli strumenti di build. Non è più necessario mantenere un file tools.go separato:
// go.mod
module mioprogetto
go 1.24
tool golang.org/x/tools/cmd/stringer
Context nel Package testing
Il package testing ora supporta nativamente i context. I tipi *testing.T
e *testing.B
includono un metodo Context()
che restituisce un context.Context
cancellato prima dell’esecuzione delle funzioni Cleanup.
func TestEsempio(t *testing.T) {
ctx := t.Context()
// Usa il context per il test
}
Nuovo Package testing/synctest
È stato introdotto un nuovo package sperimentale per il testing di codice concorrente. Permette di creare “bolle” di goroutine con un orologio simulato, semplificando notevolmente il testing di codice time-sensitive.
func TestTimeSensitive(t *testing.T) {
clock := synctest.NewClock()
bubble := synctest.NewBubble(clock)
bubble.Run(func() {
// Il codice qui dentro vedrà il tempo simulato
})
}
Altre Novità Rilevanti
- Supporto migliorato per i finalizer con
runtime.AddCleanup
- Nuove interfacce
encoding.TextAppender
eencoding.BinaryAppender
- Generazione di stringhe casuali crittograficamente sicure con
rand.Text