¿Qué hay de nuevo en Go 1.24?
Go 1.24 se perfila como una versión significativa, introduciendo una serie de mejoras centradas en el rendimiento, la seguridad y la experiencia del desarrollador. Estos cambios tienen como objetivo hacer que Go sea aún más potente y eficiente para la construcción de aplicaciones modernas.
Mejora del Rendimiento
Una mejora general del rendimiento con una reducción del 2-3% en la sobrecarga de la CPU en un conjunto de benchmarks representativos. Estas mejoras incluyen una nueva implementación de mapa incorporada, una asignación de memoria más eficiente de objetos pequeños y una nueva implementación de mutex interno en tiempo de ejecución. Los resultados pueden variar según la aplicación.
Criptografía Post-Cuá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 post-cuántico anteriormente conocido como Kyber y especificado en FIPS 203. Esta adición prepara a Go para el futuro de la seguridad criptográfica.
Mejora de TLS
Soporte para Encrypted Client Hello (ECH) en TLS. Esta característica se puede habilitar completando el campo Config.EncryptedClientHelloKeys
, mejorando la privacidad y la seguridad para las conexiones TLS.
Nuevo Mapa de Tabla Suiza
Una implementación de mapa mejorada para un mejor rendimiento. Esta nueva implementación se basa en Tablas Suizas, y se puede deshabilitar con el flag de compilación GOEXPERIMENT=noswissmap
.
Actualización de Mapa de Sincronización
Rendimiento mejorado para las modificaciones de mapas en sync.Map
. Es mucho menos probable que las modificaciones de conjuntos disjuntos de claves entren en conflicto en mapas más grandes, y ya no se requiere ningún tiempo de aumento para lograr cargas de baja contención desde el mapa. Si encuentra problemas, puede volver a la implementación anterior utilizando GOEXPERIMENT=nosynchashtriemap
.
Marshalling JSON Mejorado
Una nueva opción de etiqueta omitempty
para la omisión más inteligente de campos de estructura durante el marshaling JSON. Al realizar el marshaling, un campo de estructura con la opción omitempty
se omitirá si su valor es cero. Si el tipo de campo tiene un método IsZero() bool
, este se utilizará para determinar si el valor es cero.
Limpieza del Tiempo de Ejecución
Introducción de la función AddCleanup
para reemplazar SetFinalizer
para una mejor gestión de recursos. A diferencia de SetFinalizer
, no resucita el objeto al que está adjunto para la finalización, y se pueden adjuntar varias limpiezas a un solo objeto. El nuevo código debería preferir AddCleanup
sobre SetFinalizer
.
Directivas de Herramientas en go.mod
Seguimiento mejorado de las dependencias ejecutables utilizando directivas de herramientas en go.mod
. Esto elimina la necesidad de la solución anterior de agregar herramientas como importaciones en blanco a un archivo convencionalmente llamado “tools.go”.
Acceso Limitado por Directorio
Nuevo tipo os.Root
para operaciones de sistema de archivos controladas. El tipo os.Root
proporciona la capacidad de realizar operaciones del sistema de archivos dentro de un directorio específico, evitando el acceso fuera de la ruta especificada.
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 en la burbuja actual se bloqueen. Este paquete es experimental y debe habilitarse configurando GOEXPERIMENT=synctest
en tiempo de compilación.
Caché de Construcción
Los ejecutables go run
ahora se almacenan en caché para una ejecución más rápida. Esto hace que las ejecuciones repetidas sean más rápidas a expensas de hacer que la caché sea más grande.
Rendimiento de Cgo
Nuevas anotaciones #cgo noescape
y #cgo nocallback
para un mejor rendimiento de Cgo. #cgo noescape cFunctionName
le dice al compilador que la memoria pasada a la función C no se escapa. #cgo nocallback cFunctionName
le dice al compilador que la función C no llama a ninguna función Go.
Punteros Débiles
Soporte para punteros débiles para hacer referencia de forma segura a la memoria sin impedir la recuperación. Los punteros débiles son una primitiva de bajo nivel proporcionada para permitir la creación de estructuras de memoria eficiente, como mapas débiles para asociar valores, mapas de canonicalizaciones y varios tipos de cachés.
Mejora de Benchmark
Nuevo método testing.B.Loop
para benchmarks más rápidos y menos propensos a errores. La función benchmark se ejecutará exactamente una vez por -count
, por lo que los pasos costosos de configuración y limpieza se ejecutan solo una vez. Los parámetros y resultados de las llamadas a funciones se mantienen activos, evitando que el compilador optimice completamente el cuerpo del bucle.
Go 1.24 se perfila como una versión significativa, que ofrece mejoras sustanciales en varios aspectos del lenguaje y su ecosistema.