Il team del linguaggio ha rilasciato Go 1.24, release che introduce funzionalità e ottimizzazioni mantenendo la compatibilità con le versioni precedenti.
Funzionalità di Go 1.24
Go 1.24 supporta gli alias di tipo generics permettendo di parametrizzarli come con i tipi definiti. È per esempio possibile definire un alias come type MioAlias[T int | string] = T
, utilizzabile poi con variabili di tipo int
o string
. Tale funzionalità è disattivabile impostando GOEXPERIMENT=noaliastypeparams
ma l'opzione verrà rimossa in Go 1.25.
Nel contesto dei moduli è stata introdotta la direttiva tool
nel file go.mod
per facilitare il tracciamento delle dipendenze eseguibili. Questo approccio sostituisce la pratica di aggiungere strumenti come importazioni vuote in tools.go
. Ora, tramite il comando go tool
, è possibile eseguire sia strumenti personalizzati che quelli inclusi nella distribuzione del linguaggio. Inoltre, il comando go get
dispone del flag -tool
per aggiungere la direttiva tool
per un pacchetto specifico. Il meta-pattern tool
consente poi di aggiornare o installare in blocco gli strumenti in un modulo con go get tool
o go install tool
.
Gli eseguibili creati con go run
e go tool
vengono automaticamente memorizzati nella cache di build per velocizzare le esecuzioni a fronte di un aumento dello spazio occupato dalla cache. I comandi go build
, go install
e go test
includono il flag -json
che produce output strutturato in formato JSON per i risultati di build ed eventuali errori. I dati dei risultati di build e test sono poi distinti da un nuovo tipo Action
.
Go 1.24 introduce la variabile d'ambiente GOAUTH
per un metodo di autenticazione più flessibile. go build
imposta la versione del modulo principale nel file binario compilato basandosi sui tag e/o sulle informazioni di commit del sistema di versioning. In presenza di modifiche non committate, il numero di versione aggiunge automaticamente il suffisso +dirty
.
Per ignorare le informazioni di versioning è possibile utilizzare -buildvcs=false
. L'impostazione GODEBUG=toolchaintrace=1
aiuta inoltre a tracciare il processo di selezione della toolchain di go
.
Il tipo os.Root
consente di eseguire operazioni sul filesystem in una directory specifica garantendo che le operazioni siano limitate ad essa e prevenendo accessi a percorsi esterni tramite link simbolici. runtime.AddCleanup
fornisce un meccanismo di finalizzazione più efficiente rispetto a runtime.SetFinalizer
mentre testing.B.Loop
offre infine un modo meno soggetto a errori per eseguire iterazioni nei benchmark.
Prestazioni e runtime
Come verificato dai benchmark, Go 1.24 apporta ottimizzazioni al runtime con una riduzione media del 2-3% dell'overhead della CPU. Le ottimizzazioni includono un'implementazione della mappa basata su Swiss Tables, un'allocazione della memoria più efficiente per oggetti di piccole dimensioni e un'implementazione del mutex interno al runtime. Si possono disabilitare la nuova implementazione della mappa e il mutex interno impostando GOEXPERIMENT=noswissmap
e GOEXPERIMENT=nospinbitmutex
durante il processo di build.