Lanzamiento de Go 1.22

Se ha presentado el lanzamiento del lenguaje de programación Go 1.22, que es desarrollado por Google con la participación de la comunidad como una solución híbrida, combinando el alto rendimiento de los lenguajes compilados con las ventajas de los lenguajes de scripting, como la facilidad para escribir código, la rapidez en el desarrollo y la protección contra errores. El código del proyecto se distribuye bajo la licencia BSD.

La sintaxis de Go se basa en elementos familiares del lenguaje C, con algunas tomas del lenguaje Oberon. El lenguaje es bastante conciso, pero el código es fácil de leer y entender. El código en Go se compila en archivos ejecutables binarios independientes, que se ejecutan de manera nativa, sin la necesidad de una máquina virtual (los módulos de perfilado, depuración y otras subsistemas de detección de problemas se integran como componentes de runtime), lo que permite alcanzar un rendimiento comparable al de los programas en C.

El proyecto se desarrolla inicialmente con un enfoque en la programación concurrente y un trabajo eficiente en sistemas multinúcleo, proporcionando, a nivel de operadores, herramientas para organizar cálculos paralelos y la interacción entre métodos ejecutados en paralelo. El lenguaje también ofrece herramientas integradas para proteger contra el acceso a áreas no permitidas de bloques de memoria asignados y permite el uso de un recolector de basura.

Entre los cambios en la nueva versión:

  • Se ha añadido soporte para la definición de rangos de números enteros en los bucles «for», por ejemplo, para iterar los valores del 0 al 9 ahora se puede utilizar el bucle «for i := range 10 {…}».
  • Se ha añadido soporte experimental (GOEXPERIMENT=rangefunc) para funciones de definición de rango en los bucles «for», lo que permite especificar una función como iterador. Por ejemplo, «for i, x := range slices.Backward(s) {…}».
  • Se ha resuelto un antiguo problema con los bucles «for» que causaba que al invocar goroutines se compartieran variables del ciclo en diferentes iteraciones. Por ejemplo, el código values := []string{"a", "b", "c"} for _, v := range values { go func() { fmt.Println(v) done <- true }() } ahora imprimirá «a», «b» y «c», en lugar de solo «c», como se hacía anteriormente.
  • Se ha optimizado el manejo de la memoria en runtime, lo que ha llevado a un aumento del rendimiento de entre el 1 y el 3% y a una reducción del consumo de memoria en la mayoría de las aplicaciones del 1%.
  • Se ha continuado el trabajo sobre la implementación de optimizaciones en el compilador basadas en los resultados de la profilación de código (PGO — Optimización guiada por perfil), que permiten tener en cuenta las características determinadas en tiempo de ejecución del programa. En la nueva versión, el compilador incorpora medios de desvirtualización para reemplazar llamadas indirectas a diversos métodos con la ejecución de bloques inline desplegados.
  • Con la inclusión de PGO, el cambio añadido ha permitido aumentar el rendimiento de la mayoría de los programas entre un 2 y un 14%.
  • Se ha incorporado al compilador una implementación experimental mejorada del mecanismo de despliegue (inlining) de llamadas (GOEXPERIMENT=newinliner), que utiliza heurísticas para distinguir entre operaciones importantes y secundarias.
  • Se ha añadido a la biblioteca estándar el paquete «math/rand/v2», que ofrece una API más completa y utiliza algoritmos más rápidos para la generación de números pseudoaleatorios.
  • Se ha añadido al paquete net/http.ServeMux la posibilidad de especificar métodos y máscaras en las plantillas. Por ejemplo, la plantilla «GET /static/{id}/» se aplicará a las solicitudes con el método HTTP «GET» y conservará el valor del segundo segmento de la ruta solicitada en el identificador «id».
  • Se ha añadido al paquete database/sql soporte para el tipo Null[T], que permite escanear columnas que pueden tener el valor NULL. Además, se ha añadido una función Concat al paquete slices para fusionar varios slices de cualquier tipo.
  • En los comandos para trabajar con espacios de trabajo (colecciones de módulos), se ha proporcionado la posibilidad de utilizar el directorio «vendor», que contiene dependencias del contenido del espacio de trabajo. Este directorio se crea al ejecutar el comando «go work vendor» y se utiliza en los comandos de construcción cuando se establece la opción "-mod=vendor" (se incluye por defecto si existe el directorio vendor).

Cambios en el comportamiento de las utilidades.

  • El comando go get ya no se admite fuera del módulo en el modo obsoleto de GOPATH (es decir, con GO111MODULE=off). Otros comandos de construcción, como go build y go test, seguirán funcionando para programas obsoletos de GOPATH durante un tiempo indefinido.
  • El comando go mod init ya no intenta importar los requisitos de los módulos desde los archivos de configuración de otras herramientas de proveedores (como Gopkg.lock).
  • El comando go test -cover ahora imprime un resumen de la cobertura para los paquetes cubiertos que no tienen sus propios archivos de prueba. Hasta Go 1.22, el comando go test -cover para dicho paquete informaba de? mymod/mypack [no hay archivos de prueba]

    Y ahora, con Go 1.22, las funciones en el paquete se consideran no cubiertas: mymod/mypack coverage: 0.0% de las declaraciones. Tenga en cuenta: si un paquete no contiene ningún código ejecutable, no podemos informar un porcentaje de cobertura significativo; para tales paquetes, go test continuará informando sobre la ausencia de archivos de prueba.

  • La interfaz web de la herramienta de trazas se ha actualizado ligeramente como parte del trabajo para soportar el nuevo rastreador, se han resuelto algunos problemas y se ha mejorado la legibilidad de varias páginas. La interfaz web ahora soporta el análisis de trazas en una vista orientada a los flujos. El visor de trazas ahora también muestra la duración total de todas las llamadas del sistema. Estas mejoras son aplicables solo para la visualización de trazas creadas por programas escritos en Go 1.22 o posterior. En el próximo lanzamiento, algunas de estas mejoras se aplicarán a las trazas creadas por versiones anteriores de Go.
  • El entorno de ejecución ahora almacena metadatos de recolección de basura basados en tipos más cerca de cada objeto en el montón. Este cambio también reduce el coste de memoria de la mayoría de los programas Go en aproximadamente un 1% mediante la deduplicación de los metadatos redundantes. En algunos programas, la mejora puede ser menor, ya que este cambio corrige los límites de clase del tamaño del distribuidor de memoria, por lo que algunos objetos pueden moverse a una clase de tamaño superior. Como consecuencia de este cambio, las direcciones de algunos objetos que anteriormente siempre estaban alineados a 16 bytes (o más) ahora estarán alineados solo a 8 bytes. Algunos programas que utilizan instrucciones de ensamblador que requieren que las direcciones de memoria estén alineadas a un tamaño superior a 8 bytes y dependen del comportamiento previo de alineación del distribuidor de memoria pueden fallar, pero esperamos que tales programas sean raros. Estos programas pueden crearse con GOEXPERIMENT=noallocheaders, lo que permite volver al antiguo modelo de metadatos y restaurar el comportamiento previo de alineación, pero se aconseja a los propietarios de paquetes actualizar su código de ensamblador para evitar la suposición de alineación, ya que este método de solución se eliminará en futuras versiones.
  • Como se mencionó en las notas de la versión de Go 1.20, Go 1.22 ahora requiere la versión final de Go 1.20 o una versión más reciente para la compilación inicial. Esperamos que Go 1.24 requiera la versión final de Go 1.22 o una versión posterior para la compilación inicial.
    Original (go.dev)

Fuente: linux.org.ru

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster