3 puntos por lemonmint 2024-12-20 | 4 comentarios | Compartir por WhatsApp

[IMG] Overview of Go 1.24

La versión Go 1.24 apunta a ser un lanzamiento importante, ya que introduce diversas mejoras centradas en rendimiento, seguridad y experiencia del desarrollador. Estos cambios buscan hacer que Go sea aún más potente y eficiente para crear aplicaciones modernas.

Mejoras de rendimiento

Hubo mejoras generales de rendimiento que reducen la sobrecarga de CPU entre 2% y 3% en suites de benchmarks representativas. Estas mejoras incluyen una nueva implementación interna de map, una asignación de memoria más eficiente para objetos pequeños y una nueva implementación interna de mutex en el runtime. Los resultados pueden variar según la aplicación.

Criptografía resistente a la computación cuántica

Se introdujo el paquete crypto/mlkem, que implementa ML-KEM-768 y ML-KEM-1024. ML-KEM, anteriormente conocido como Kyber, es un mecanismo de intercambio de claves resistente a la computación cuántica especificado en FIPS 203. Esta incorporación prepara a Go para la seguridad criptográfica del futuro.

Encrypted Client Hello

Se añade soporte para ECH (Encrypted Client Hello) en TLS. Esta función puede activarse llenando el campo Config.EncryptedClientHelloKeys, y refuerza la privacidad y la seguridad de las conexiones TLS.

Nuevo Swiss Table Map

Es una implementación mejorada de map para ofrecer mejor rendimiento. Esta nueva implementación se basa en Swiss Tables y puede desactivarse usando la bandera de compilación GOEXPERIMENT=noswissmap.

Actualización de Sync Map

Se mejoró el rendimiento de modificación de maps en sync.Map. Las modificaciones sobre conjuntos de claves separados tienen mucha menos probabilidad de generar contención en maps grandes, y ya no se requiere el tiempo de preparación necesario para lograr una carga de baja contención en el map. Si surgen problemas, se puede volver a la implementación anterior con GOEXPERIMENT=nosynchashtriemap.

Mejoras en el marshaling de JSON

Se añade una nueva opción de etiqueta omitempty para omitir campos de struct de forma más inteligente durante el marshaling de JSON. Al serializar, si el valor de un campo de struct con la opción omitempty es cero, se omite. Si el tipo del campo tiene un método IsZero() bool, ese método se usa para comprobar si el valor es cero.

Limpieza del runtime

Se introdujo la función AddCleanup como reemplazo de SetFinalizer para una mejor gestión de recursos. A diferencia de SetFinalizer, no revive el objeto asociado para la finalización, y permite asociar varias limpiezas a un solo objeto. El código nuevo debería preferir AddCleanup sobre SetFinalizer.

Directiva de herramientas en go.mod

Se mejoró el seguimiento de dependencias de herramientas mediante la directiva de herramientas en go.mod. Esto elimina la necesidad de usar la solución anterior de agregar herramientas con importaciones en blanco en un archivo con el nombre convencional "tools.go".

Acceso restringido a directorios

Se incorpora el nuevo tipo os.Root para operaciones controladas sobre el sistema de archivos. El tipo os.Root ofrece la capacidad de realizar operaciones del sistema de archivos dentro de un directorio específico, evitando el acceso fuera de la ruta designada.

Mejoras en testing

Se añade el 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 hasta que todas las goroutines de la burbuja actual queden bloqueadas. Este paquete es experimental y debe activarse configurando GOEXPERIMENT=synctest en tiempo de compilación.

Caché de compilación

Los ejecutables de go run ahora se almacenan en caché para permitir ejecuciones más rápidas. Esto acelera las ejecuciones repetidas a cambio de un caché más grande.

Rendimiento de Cgo

Se añaden las nuevas anotaciones #cgo noescape y #cgo nocallback para mejorar el rendimiento de Cgo. #cgo noescape cFunctionName le indica al compilador que la memoria pasada a la función C no escapa. #cgo nocallback cFunctionName le indica al compilador que la función C no volverá a llamar funciones Go.

Punteros débiles

Se añade soporte para punteros débiles, que permiten referenciar memoria de forma segura sin impedir su recolección. Los punteros débiles son un componente básico de bajo nivel que se ofrece para crear estructuras eficientes en memoria, como maps débiles para asociar valores, maps de canonicalización y varios tipos de cachés.

Mejoras en las pruebas de benchmark

Se incorpora el nuevo método testing.B.Loop para benchmarks más rápidos y con menos errores. Las funciones de benchmark se ejecutan exactamente una vez por -count, por lo que las costosas etapas de configuración y limpieza solo se ejecutan una vez. Los parámetros y resultados de las llamadas de función se conservan, lo que impide que el compilador optimice por completo el cuerpo del bucle.

La versión Go 1.24 apunta a ser un lanzamiento importante, con mejoras significativas en varios aspectos del lenguaje y su ecosistema.

4 comentarios

 
secret3056 2024-12-20

Quienes usan Go, ¿hay alguna función que les gustaría tener?
A mí me gustaría que tuviera operadores como .? y ??, y si fuera posible, macros.

Sinceramente, las struct tags son un error.

 
gkswnsqja 2024-12-20

Yo también, personalmente, ojalá de verdad hubiera macros; ¿hasta cuándo hay que seguir haciendo generate? T_T

 
qkrqjadn 2024-12-20

Me gustaría entender por qué los struct tag se consideran un error.

 
secret3056 2024-12-20

Lo más problemático es que cuesta mucho apoyarse en herramientas.

  • Como al final son cadenas de texto, incluso si hay un error tipográfico es difícil detectarlo.
  • Excepto con JSON, no hay autocompletado ni IntelliSense.
  • Cuando se usan varias herramientas, hay que escribir todo en una sola línea, y es difícil evitar la sensación de que la legibilidad se resiente.

Hace tiempo que salió gomodifytags, pero su integración con la extensión de Go de VSC también tardó bastante.