Resumen de la versión Go 1.24: mapas Swiss Table, ML-KEM, os.Root y testing/synctest

Go 1.24 se perfila como una versión significativa, con una serie de mejoras centradas en el rendimiento, la seguridad y la experiencia del desarrollador. Estos cambios pretenden hacer que Go sea aún más potente y eficiente para la creación de aplicaciones modernas.
Mejora del rendimiento
Una mejora general del rendimiento, con una reducción del 2 al 3 % en la sobrecarga de CPU en un conjunto de benchmarks representativos. Estas mejoras incluyen una nueva implementación integrada de mapas, una asignación de memoria más eficiente para objetos pequeños y una nueva implementación de mutex interna del runtime. Los resultados pueden variar según la aplicación.
Criptografía poscuántica
Introducción del paquete crypto/mlkem, que implementa ML-KEM-768 y ML-KEM-1024. ML-KEM es un mecanismo de intercambio de claves poscuántico anteriormente conocido como Kyber y especificado en FIPS 203. Esta incorporación prepara a Go para el futuro de la seguridad criptográfica.
Mejora de TLS
Soporte para Encrypted Client Hello (ECH) en TLS. Esta funcionalidad puede habilitarse mediante el campo Config.EncryptedClientHelloKeys, lo que mejora la privacidad y la seguridad de las conexiones TLS.
Nuevo mapa Swiss Table
Una implementación de mapas mejorada para un mejor rendimiento. Esta nueva implementación se basa en Swiss Tables y puede desactivarse con la opción de compilación GOEXPERIMENT=noswissmap.
Actualización de sync.Map
Mejora del rendimiento de las modificaciones de mapas en sync.Map. Las modificaciones de conjuntos disjuntos de claves tienen mucha menos probabilidad de competir por el acceso en mapas más grandes, y ya no se requiere ningún tiempo de calentamiento para alcanzar cargas de lectura con baja contención en el mapa. Si encuentra problemas, puede volver a la implementación anterior mediante GOEXPERIMENT=nosynchashtriemap.
Codificación JSON mejorada
Una nueva opción de etiqueta omitempty para una omisión más inteligente de campos de estructuras durante la serialización JSON. Al serializar, un campo de estructura con la opción omitempty se omitirá si su valor es cero. Si el tipo del campo tiene un método IsZero() bool, este se utilizará para determinar si el valor es cero.
Limpieza en tiempo de ejecución
Introducción de la función AddCleanup para reemplazar a SetFinalizer y lograr una mejor gestión de recursos. A diferencia de SetFinalizer, no resucita el objeto al que está asociada para su finalización, y pueden asociarse múltiples limpiezas a un único objeto. El código nuevo debe preferir AddCleanup frente a SetFinalizer.
Directivas de herramientas en go.mod
Seguimiento mejorado de dependencias ejecutables mediante directivas de herramientas en go.mod. Esto elimina la necesidad de la solución anterior, que consistía en añadir herramientas como importaciones en blanco a un archivo denominado convencionalmente “tools.go”.
Acceso limitado a directorios
Nuevo tipo os.Root para operaciones controladas sobre el sistema de archivos. El tipo os.Root permite realizar operaciones del sistema de archivos dentro de un directorio específico, impidiendo el acceso fuera de la ruta indicada.
Mejoras en las pruebas
Nuevo paquete testing/synctest para probar código concurrente. La función synctest.Run inicia un grupo de goroutines en una "burbuja" aislada, y la función synctest.Wait espera a que todas las goroutines de la burbuja actual se bloqueen. Este paquete es experimental y debe habilitarse estableciendo GOEXPERIMENT=synctest en el momento de la compilación.
Caché de compilación
Los ejecutables de go run ahora se almacenan en caché para acelerar su ejecución. Esto hace que las ejecuciones repetidas sean más rápidas a costa de aumentar el tamaño de la caché.
Rendimiento de Cgo
Nuevas anotaciones #cgo noescape y #cgo nocallback para mejorar el rendimiento de Cgo. #cgo noescape cFunctionName indica al compilador que la memoria pasada a la función C no escapa. #cgo nocallback cFunctionName indica al compilador que la función C no llama de vuelta a ninguna función de Go.
Punteros débiles
Soporte para punteros débiles que permiten referenciar memoria de forma segura sin impedir su recuperación. Los punteros débiles son una primitiva de bajo nivel que permite crear estructuras eficientes en memoria, como mapas débiles para asociar valores, mapas de canonicalización y diversos tipos de cachés.
Mejora de benchmarks
Nuevo método testing.B.Loop para benchmarks más rápidos y menos propensos a errores. La función de benchmark se ejecutará exactamente una vez por cada -count, de modo que los pasos de configuración y limpieza costosos se ejecutan una sola vez. Los parámetros y resultados de las llamadas a funciones se mantienen vivos, lo que evita que el compilador optimice por completo el cuerpo del bucle.
Go 1.24 se perfila como una versión significativa, con mejoras sustanciales en diversos aspectos del lenguaje y de su ecosistema.
