La nueva versión de Go 1.22, llega seis meses después de la versión 1.21, con una serie de cambios notables en el conjunto de herramientas, el runtime, mejoras de optimización, mejoras en el compilador y bibliotecas.
Para quienes desconocen de Go, debo decirles que este es un lenguaje de programación que está siendo desarrollado por Google con la participación de la comunidad como una solución híbrida que combina el alto rendimiento de los lenguajes compilados con ventajas tales como los lenguajes de scripting como la facilidad para escribir código, velocidad de desarrollo y protección contra errores.
Principales novedades de Go 1.22
En esta nueva versión, que se introduce de Go 1.22, se destacan dos cambios en los bucles «for», ya que anteriormente, las variables declaradas por un bucle «for» se creaban una vez y se actualizaban en cada iteración. En Go 1.22, cada iteración del bucle crea nuevas variables para evitar errores de compartición accidental, además de ello se agregó soporte experimental (GOEXPERIMENT=rangefunc) para funciones de rango a bucles «for», lo que permite especificar una función como iterador y se resolvió un problema de larga data con los bucles for que provocaba que las llamadas a corrutinas compartieran variables de bucle entre iteraciones. Además, los bucles «for» ahora pueden recorrer enteros. Por ejemplo:
package main import "fmt" func main() { for i := range 10 { fmt.Println(10 - i) } fmt.Println("¡go1.22 despega!") }
Otro cambio destacado en esta nueva versión es la introducción de la capacidad de utilizar un directorio «vendor« que contiene las dependencias del espacio de trabajo. Ahora, los comandos pueden emplear este directorio, el cual se crea con `go work vendor` y se utiliza en los comandos de compilación cuando se establece `-mod` en «vendor«, siendo este el valor predeterminado cuando existe un directorio «vendor» en el espacio de trabajo.
Es importante señalar que la funcionalidad de `go get` ya no es compatible fuera de un módulo en el modo GOPATH heredado Sin embargo, otros comandos de compilación como `go build` y `go test` seguirán funcionando indefinidamente para programas GOPATH heredados. Además, el comando `go mod init` ya no intentará importar los requisitos del módulo desde archivos de configuración de otras herramientas de «vendoring» (como Gopkg.lock).
Go 1.22 introduce un nuevo paquete io/unsafe que proporciona funcionalidad para trabajar con punteros y memoria no segura. Este paquete ofrece métodos para convertir punteros a y desde tipos seguros y no seguros, así como para realizar operaciones de copia de memoria sin verificar los límites.
Se continuó trabajando para incluir optimizaciones en el compilador basadas en los resultados del perfilado de código PGO, y es que ahora el compilador utiliza herramientas de desvirtualización para reemplazar las llamadas indirectas de varios métodos con la ejecución de bloques en línea expandidos. Cuando se habilitó PGO, el cambio agregado mejoró el rendimiento de la mayoría de los programas entre un 2% y un 14%.
En la versión de Go para Windows, los programas que vinculan o cargan bibliotecas Go construidas con -buildmode=c-archive o -buildmode=c-shared ahora pueden utilizar la API de registro de eventos de Windows (ETW) a través de los nuevos paquetes de runtime/trace y tracehook, que implementan el protocolo de recopilación de trazas de eventos Go como un proveedor ETW.
De los demás cambios que se destacan:
- El comando go test -cover ahora imprime resúmenes de cobertura para paquetes cubiertos que no tienen sus propios archivos de prueba.
- os/exec, se ha agregado la posibilidad de definir los atributos del contexto, lo que permite establecer valores como el directorio de trabajo, variables de entorno y el descriptor de archivos de entrada/salida para los comandos ejecutados.
- Se optimizó la gestión de la memoria en el runtime, lo que se tradujo en un aumento del rendimiento entre un 1% y un 3% y una reducción del consumo de memoria en la mayoría de las aplicaciones del 1%.
- El paquete net/http, se ha agregado la función CloseIdleConnections al cliente HTTP, que cierra todas las conexiones inactivas que el cliente ha usado recientemente
- Se ha agregado al compilador una implementación mejorada experimental (GOEXPERIMENT=newinliner) del mecanismo de inserción de llamadas, que utiliza heurísticas para separar las operaciones importantes de las que no lo son.
- Se ha agregado el paquete » math/rand/v2 » a la biblioteca estándar, que ofrece una API más consistente y utiliza algoritmos más rápidos para generar números pseudoaleatorios.
- El paquete net/http.ServeMux ha agregado la capacidad de especificar métodos y máscaras en plantillas.
Finalmente, si estás interesado en poder conocer más al respecto, puedes consultar los detalles en el siguiente enlace.