- La versión Go 1.22 se lanzó 6 meses después de Go 1.21.
- La mayoría de los cambios están en la implementación de la toolchain, el runtime y las librerías.
- Se mantiene la promesa de compatibilidad de Go 1, y se espera que casi todos los programas en Go compilen y se ejecuten igual que antes.
Cambios en el lenguaje
- Hay dos cambios en los bucles "for".
- Antes, las variables declaradas por un bucle "for" se creaban una vez y se actualizaban en cada iteración, pero en Go 1.22 cada iteración del bucle crea una variable nueva para evitar bugs por compartición accidental.
- Los bucles "for" ahora pueden hacer range sobre enteros.
Herramientas
Comando Go
- Se puede usar el directorio
vendor en un workspace para gestionar dependencias.
go get ya no es compatible en el modo heredado GOPATH, que no usa módulos.
go mod init ya no intenta importar requisitos de módulos desde archivos de configuración de otras herramientas de vendoring.
go test -cover ahora imprime un resumen de cobertura para paquetes que no tienen sus propios archivos de prueba.
Trace
- La UI web de la herramienta
trace fue rediseñada parcialmente para soportar el nuevo tracer.
Vet
- Cambió el comportamiento de la herramienta
vet para las variables de bucle.
- Se agregó una nueva advertencia para llamadas a
append que no agregan valores.
- Se agregó una nueva advertencia sobre problemas al usar
time.Since en una sentencia defer.
- Se agregó una nueva advertencia cuando no coinciden los pares clave-valor en llamadas a
log/slog.
Runtime
- El rendimiento de CPU mejora entre 1% y 3% al mantener los metadatos del garbage collector basados en tipos más cerca de los objetos del heap.
Compilador
- Las compilaciones con Profile-Guided Optimization (PGO) ahora pueden devirtualizar más llamadas que antes.
Linker
- Se cambió el comportamiento de las flags
-s y -w del linker para que funcionen de forma más consistente en todas las plataformas.
Bootstrap
- Go 1.22 requiere para el bootstrap la versión final de parche de Go 1.20 o una posterior.
Librería principal
Nuevo paquete math/rand/v2
math/rand/v2 es el primer paquete “v2” de la librería estándar y tiene varios cambios importantes comparado con math/rand.
Nuevo paquete go/version
- Se agregó el nuevo paquete
go/version, que implementa funciones para validar y comparar cadenas de versión de Go.
Patrones de enrutamiento mejorados
- El routing HTTP de la librería estándar se mejoró para ser más expresivo.
Cambios menores en la librería
- Hay cambios menores y mejoras de rendimiento en varias librerías.
Ports
Darwin
- En macOS, en la arquitectura x86 de 64 bits (
darwin/amd64), la toolchain de Go ahora genera por defecto ejecutables con posición independiente (PIE).
Arm
- Se puede usar la variable de entorno
GOARM para elegir entre punto flotante por software o por hardware.
Loong64
- El port
loong64 ahora pasa argumentos y resultados de funciones usando registros.
OpenBSD
- Se agregó un port experimental para PowerPC big-endian de 64 bits (
openbsd/ppc64) en OpenBSD.
Opinión de GN⁺
- En este lanzamiento de Go 1.22 destacan especialmente los cambios en los bucles "for" y la introducción del nuevo paquete
math/rand/v2. Estos cambios ofrecen mejor rendimiento y estabilidad para los desarrolladores de Go, y las nuevas funciones reflejan la evolución del lenguaje Go.
- El paquete
math/rand/v2 ofrece una mejor generación de números aleatorios mediante algoritmos más rápidos y una nueva API, lo que representa una mejora importante para criptografía y otras aplicaciones que dependen de la aleatoriedad.
- Se espera que Go 1.22 tenga un impacto positivo en la comunidad Go al ofrecer varias optimizaciones y nuevas funciones que mejoran el rendimiento y la experiencia del desarrollador sin perder compatibilidad.
1 comentarios
Opiniones en Hacker News
io.Copyahora puede usar la llamada al sistemasplice(2)de Linux al copiar deTCPConnaUnixConn. Valora mucho las ventajas que se pueden obtener en el paqueteiomediante este tipo de patrones.httpmuxgo121.sql.Null[T]. Antes usabanulldesqlboiler, que tiene una API similar asql.Null, pero además incluye un métodoIsSet() boolque indica si el valor fue establecido explícitamente.chi.any.