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 e encoding.BinaryAppender
  • Generazione di stringhe casuali crittograficamente sicure con rand.Text