Ir a la versión 1.22

Se presenta el lanzamiento del lenguaje de programación Go 1.22, 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 de los lenguajes de scripting como la facilidad para escribir código. , velocidad de desarrollo y 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 algunos préstamos del lenguaje Oberon. El lenguaje es bastante conciso, pero el código es fácil de leer y comprender. El código Go se compila en archivos ejecutables binarios independientes que se ejecutan de forma nativa, sin utilizar una máquina virtual (los módulos de creación de perfiles, depuración y otros subsistemas para identificar problemas en tiempo de ejecución se integran como componentes de tiempo de ejecución), lo que permite un rendimiento comparable al de los programas C.

El proyecto se desarrolla inicialmente con miras a la programación multiproceso y el funcionamiento eficiente en sistemas multinúcleo, incluido el suministro de medios a nivel de operador para organizar la computación paralela y la interacción entre métodos ejecutados en paralelo. El lenguaje también proporciona protección integrada contra bloques de memoria sobreasignados y ofrece la posibilidad de utilizar un recolector de basura.

Entre los cambios en la nueva versión:

  • Se ha agregado soporte para definir rangos de números enteros a los bucles "for", por ejemplo, para iterar a través de valores del 0 al 9, ahora puede usar el bucle "for i := range 10 {...}".
  • Se agregó soporte experimental (GOEXPERIMENT=rangefunc) para funciones de rango a bucles for, lo que le permite especificar una función como iterador. Por ejemplo, "para i, x := sectores de rango.Hacia atrás(s) {...}"
  • Se resolvió un problema de larga data con los bucles for que provocaba que las llamadas a corrutinas (gorrutinas) compartieran variables de bucle entre iteraciones. Por ejemplo, los valores del código := []string{"a", "b", "c"} para _, v := valores de rango { go func() { fmt.Println(v) done < - true }() } ahora generará "a", "b" y "c", y no solo "c", como era antes.
  • Se optimizó la gestión de la memoria en tiempo de ejecución, lo que condujo a 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%.
  • Se continuó trabajando para incluir optimizaciones en el compilador basadas en los resultados del perfilado de código (PGO - Optimización guiada por perfil), que permite tener en cuenta características determinadas durante la ejecución del programa. En la nueva versión, 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%.
  • 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.
  • El paquete "math/rand/v2" se ha agregado a la biblioteca estándar, que ofrece una API más holística 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, por ejemplo, la plantilla “GET /static/{id}/” se aplicará a las solicitudes con el método HTTP “GET” y almacenará el valor del segundo segmento de la ruta solicitada en el identificador " id".
  • El paquete de base de datos/sql ha agregado soporte para el tipo Null[T], lo que le permite escanear columnas que pueden ser NULL. Se agregó la función Concat al paquete de sectores para fusionar múltiples sectores de cualquier tipo.
  • En los comandos para trabajar con espacios de trabajo (colecciones de módulos), es posible utilizar el directorio "proveedor", que contiene dependencias del contenido del espacio de trabajo. El directorio se crea al ejecutar el comando "ir a trabajar con el proveedor" y se usa en los comandos de compilación cuando se configura la opción "-mod=vendor" (se habilita de forma predeterminada si hay un directorio de proveedores).

Cambios en el comportamiento de las empresas de servicios públicos.

  • go get ya no es compatible fuera de un módulo en el modo GOPATH heredado (es decir, con GO111MODULE=off). Otros comandos de compilación, como go build y go test, seguirán funcionando indefinidamente para los programas GOPATH heredados.
  • go mod init ya no intenta importar requisitos de módulo desde archivos de configuración para herramientas de otros proveedores (como Gopkg.lock).
  • go test -cover ahora imprime resúmenes de cobertura para paquetes cubiertos que no tienen sus propios archivos de prueba. Antes de Go 1.22, ¿se realizaría un informe de cobertura de prueba para dicho paquete? mymod/mypack [sin archivos de prueba]

    y ahora a partir de Go 1.22, las funciones de un paquete se consideran descubiertas: cobertura mymod/mypack: 0.0% de declaraciones Nota: si un paquete no contiene ningún código ejecutable, no podemos informar un porcentaje significativo de cobertura; para dichos paquetes, go test seguirá informando archivos de prueba faltantes.

  • La interfaz web de la herramienta de rastreo se actualizó ligeramente como parte del trabajo para respaldar el nuevo rastreador, solucionando algunos problemas y mejorando la legibilidad de varias páginas. La interfaz web ahora admite la exploración de seguimientos en una vista segura para subprocesos. El visor de seguimiento ahora también muestra la duración completa de todas las llamadas al sistema. Estas mejoras solo se aplican a la visualización de seguimientos producidos por programas creados en Go 1.22 o posterior. Una versión futura traerá algunas de estas mejoras a los rastros producidos por la versión anterior de Go.
  • El tiempo de ejecución ahora almacena metadatos de recolección de basura basados ​​en tipos más cerca de cada objeto del montón. Este cambio también reduce la sobrecarga de memoria de la mayoría de los programas Go en aproximadamente un 1% al deduplicar metadatos redundantes. En algunos programas, la mejora puede ser menor porque este cambio ajusta los límites de clase de tamaño del asignador de memoria, por lo que algunos objetos pueden moverse a una clase de tamaño mayor. El efecto de este cambio es que las direcciones de algunos objetos que antes siempre estaban alineadas en un límite de 16 bytes (o superior) ahora solo estarán alineadas en un límite de 8 bytes. Algunos programas que utilizan instrucciones ensambladoras que requieren que las direcciones de memoria estén alineadas en 8 bytes y dependen del comportamiento de alineación anterior del asignador de memoria pueden fallar, pero esperamos que tales programas sean raros. Dichos programas se pueden crear con GOEXPERIMENT=noallocheaders con la opción de recurrir al antiguo modelo de metadatos y restaurar el comportamiento de alineación anterior, pero los propietarios de los paquetes deben actualizar su código ensamblador para evitar la suposición de alineación, ya que esta solución alternativa se eliminará en una versión futura. .
  • Como se menciona 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 posterior para las compilaciones iniciales. Esperamos que Go 1.24 requiera la versión final de Go 1.22 o posterior para la compilación inicial.
    Original (go.dev)

Fuente: linux.org.ru

Compre alojamiento confiable para sitios con protección DDoS, servidores VPS VDS 🔥 Compra alojamiento web fiable con protección DDoS, servidores VPS VDS | ProHoster