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 que combina el alto rendimiento de los lenguajes compilados con las ventajas de los lenguajes de script, como la facilidad de escritura de código, la rapidez de 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 a la vez el código es fácil de leer y comprender. El código en Go se compila en archivos ejecutables binarios independientes, que se ejecutan de forma nativa, sin usar una máquina virtual (los módulos de perfilado, depuración y otros subsistemas de detección de problemas se integran como componentes de runtime), lo que permite lograr un rendimiento comparable al de programas en C.

El proyecto se desarrolla inicialmente teniendo en cuenta la programación concurrente y el trabajo eficiente en sistemas multinúcleo, incluido el suministro de herramientas a nivel de operadores para organizar cálculos paralelos y la interacción entre métodos que se ejecutan en paralelo. El lenguaje también proporciona herramientas integradas para prevenir el acceso a áreas no permitidas de bloques de memoria asignados y asegura la capacidad de usar un recolector de basura.

Entre los cambios en la nueva versión:

  • Se ha añadido soporte para definir rangos de enteros en los bucles 'for', por ejemplo, para iterar sobre valores de 0 a 9, ahora puedes usar 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 llamar a las goroutines se compartieran las 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', y no solo 'c', como ocurría anteriormente.
  • Se ha optimizado el uso de memoria en runtime, lo que ha llevado a un aumento del rendimiento del 1-3% y a una reducción en el consumo de memoria en la mayoría de las aplicaciones del 1%.
  • Se ha continuado el trabajo en la implementación de optimizaciones en el compilador basadas en los resultados del perfilado de código (PGO — Profile-guided optimization), que permiten tener en cuenta características definidas durante la ejecución del programa. En la nueva versión, se han incorporado herramientas de desvirtualización en el compilador para reemplazar llamadas indirectas a diversos métodos por bloques inline expandidos.
  • Al habilitar 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 añadido al compilador una implementación experimental (GOEXPERIMENT=newinliner) mejorada del mecanismo de expansión (inlining) de llamadas, utilizando heurísticas para diferenciar entre operaciones importantes y secundarias.
  • Se ha añadido al paquete estándar la biblioteca "math/rand/v2", que ofrece una API más coherente y emplea algoritmos más veloces para la generación de números pseudoaleatorios.
  • Se ha añadido al paquete net/http.ServeMux la capacidad de especificar métodos y patrones en las plantillas; por ejemplo, el patrón "GET /static/{id}/" se aplicará a solicitudes con el método HTTP "GET" y almacenará 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 un valor NULL. Al paquete slices se le ha añadido la función Concat 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 usar el directorio "vendor", que contiene las 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 al establecer la opción "-mod=vendor" (incluida por defecto si hay un directorio vendor).

Cambios en el comportamiento de las utilidades.

  • go get ya no es compatible fuera del módulo en el modo GOPATH obsoleto (es decir, con GO111MODULE=off). Otros comandos de construcción, como go build y go test, seguirán funcionando para programas en GOPATH obsoleto durante un tiempo indefinido.
  • go mod init ya no intenta importar las dependencias de los módulos desde archivos de configuración de otras herramientas de proveedores (como Gopkg.lock).
  • go test -cover ahora imprime un resumen de cobertura para los paquetes cubiertos que no tienen sus propios archivos de prueba. Hasta Go 1.22, go test -cover para dicho paquete informaría: 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 declaraciones. Tenga en cuenta que si el paquete no contiene ningún código ejecutable, no podemos informar de un porcentaje significativo de cobertura; para tales paquetes, go test seguirá informando que no hay archivos de prueba.

  • La interfaz web de la herramienta trace ha sido ligeramente actualizada en el marco del trabajo para dar soporte al nuevo rastreador, se han resuelto algunos problemas y se ha mejorado la legibilidad de varias páginas. La interfaz web ahora permite explorar rastreos en una vista orientada a flujos. El visor de rastreo ahora también muestra la duración total de todas las llamadas al sistema. Estas mejoras son aplicables solo a la visualización de rastreos generados por programas construidos en Go 1.22 o versiones más recientes. En una próxima versión, algunas de estas mejoras se incorporarán a los rastreos creados por versiones anteriores de Go.
  • El entorno de ejecución ahora almacena los metadatos de la recolección de basura basados en tipos más cerca de cada objeto en el montón. Este cambio también reduce el costo de memoria de la mayoría de los programas Go en aproximadamente un 1% al deduplicar los metadatos redundantes. En algunos programas, la mejora puede ser menor, ya que este cambio corrige los límites de clase de tamaño del asignador de memoria, por lo que algunos objetos pueden ser movidos a una clase de tamaño superior. Como resultado de este cambio, las direcciones de algunos objetos que anteriormente siempre estaban alineados a un límite de 16 bytes (o más) ahora solo estarán alineados a un límite de 8 bytes. Algunos programas que utilizan instrucciones de ensamblador, que requieren que las direcciones de memoria estén alineadas a tamaños superiores a 8 bytes y dependen del comportamiento anterior del alineador de memoria, pueden fallar, pero esperamos que tales programas sean raros. Estos programas pueden ser creados con GOEXPERIMENT=noallocheaders para revertir al antiguo modelo de metadatos y restaurar el comportamiento anterior de alineación, pero los propietarios de los paquetes deben actualizar su código ensamblador para evitar asumir alineaciones, ya que este método alternativo se eliminará en una futura versión.
  • Como se mencionó en las notas de la versión de Go 1.20, Go 1.22 ahora requiere una versión final de Go 1.20 o más reciente para la compilación inicial. Esperamos que Go 1.24 requiera una 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