---
id: 149c0672eec2caba57477612564e9368
author: Lemon Mint
title: 'Panoramica della versione Go 1.24: Mappe Swiss Table, ML-KEM, os.Root e testing/synctest'
description: 'Panoramica tecnica di Go 1.24: mappe integrate basate su Swiss Table, crypto/mlkem (FIPS 203), TLS Encrypted Client Hello, runtime.AddCleanup, os.Root e testing/synctest.'
language: it
date: 2024-12-20T00:23:21.60729Z
path: /blog/posts/whats-new-in-go-1-24-z83ff24d2
category: release
---

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.

![Panoramica di Go 1.24](/assets/images/whats-new-in-go1.24/overview.webp)
