El nuevo lanzamiento del lenguaje Go, versión 1.24, llega seis meses después de Go 1.23. La mayoría de los cambios se encuentran en la implementación de la herramienta, el tiempo de ejecución y las bibliotecas. Como siempre, la versión garantiza el compromiso de compatibilidad de Go 1. Se espera que los desarrolladores del lenguaje continúen compilando y ejecutando casi todos los programas de Go como antes.
Cambios en el lenguaje
Go 1.24 ahora soporta completamente alias de tipos genéricos: un alias de tipo puede ser parametrizado como un tipo declarado. Los detalles se encuentran en la especificación del lenguaje. Por el momento, esta opción puede desactivarse configurando GOEXPERIMENT=noaliastypeparams; sin embargo, la opción aliastypeparams será eliminada en Go 1.25.
Herramientas
El comando go
Ahora los módulos go pueden rastrear dependencias ejecutables usando la directiva tool en go.mod. Esto elimina la necesidad de una solución anterior que añadía herramientas como importaciones vacías en el archivo, comúnmente llamado “tools.go”. El comando go tool ahora puede ejecutar estas herramientas además de las herramientas proporcionadas con Go. Más información se puede ver en la documentación.
La nueva bandera -tool para go get agrega la directiva de herramientas en el módulo actual para los paquetes especificados, además de añadir la directiva de requisitos.
Nuevo el meta-patrón tool se refiere a todas las herramientas en el módulo actual. Esto puede ser utilizado para actualizar todas a través de go get tool o para instalarlas en su directorio GOBIN a través de go install tool.
Los archivos ejecutables creados a través de go run y el nuevo comportamiento de go tool ahora se almacenan en caché en la caché de compilación de Go. Esto hace que las ejecuciones repetidas se beneficien de una caché aumentada. #69290.
Los comandos go build y go install ahora aceptan la bandera -json, que informa la salida y errores de compilación como salida estructurada JSON en la salida estándar. Los detalles del formato pueden verse en go help buildjson.
Además, go test -json ahora informa la salida y errores de compilación en JSON, mezclándose con el JSON del resultado de las pruebas. Se pueden diferenciar por los nuevos tipos de Action, pero si causan problemas en el sistema de integración de pruebas, se puede volver a la salida textual de la compilación a través de la configuración GODEBUG gotestjsonbuildtext=1.
La nueva variable de entorno GOAUTH proporciona una forma flexible de autenticar tiradas privadas de módulos. Se pueden ver los detalles en go help goauth.
El comando go build ahora establece la versión del módulo principal en el binario compilado, basado en la etiqueta y/o el commit del sistema de control de versiones. El sufijo +dirty se añadirá si hay cambios no confirmados. Se puede usar la bandera -buildvcs=false para omitir la información del control de versiones del binario.
Nuevo configuración de GODEBUG toolchaintrace=1 ahora se puede utilizar para rastrear el proceso de selección del toolchain en el comando go.
Cgo
Cgo soporta nuevas anotaciones para funciones C para mejorar el rendimiento en tiempo de ejecución. #cgo noescape cFunctionName le dice al compilador que la memoria pasada a la función C cFunctionName no se escapa. #cgo nocallback cFunctionName le dice al compilador que la función C cFunctionName no llama de vuelta a ninguna función Go. Más información se puede ver en la documentación de cgo.
Cgo ahora se niega a compilar llamadas a funciones C que tienen declaraciones incompatibles. Por ejemplo, si f se declara simultáneamente como void f(int) y void f(double), cgo reportará un error en lugar de generar una secuencia de llamada incorrecta f(0). Una novedad en esta versión es la mejor detección de esta condición de error cuando las declaraciones incompatibles aparecen en diferentes archivos. #67699.
Objdump
La herramienta objdump ahora soporta la desensamblación en 64 bits de LoongArch (GOARCH=loong64), RISC-V (GOARCH=riscv64) y S390X (GOARCH=s390x).
Vet
El nuevo analizador de tests informa sobre errores comunes en las declaraciones de tests, fuzzers, benchmarks y ejemplos en paquetes de tests, como nombres mal formados, firmas incorrectas o ejemplos que documentan identificadores inexistentes. Algunos de estos errores pueden resultar en tests no ejecutados.
El analizador printf existente ahora informa diagnósticos sobre llamadas de la forma fmt.Printf(s), donde s es una cadena de formato no constante, sin otros argumentos. Tales llamadas casi siempre son un error, ya que el valor s puede contener el símbolo %; en su lugar, use fmt.Print. 60529. Esta verificación tiende a encontrar problemas en el código existente, y por lo tanto se aplica solo cuando la versión del lenguaje (como se indica en la directiva go del archivo go.mod o comentarios `//go:build) es al menos Go 1.24, para evitar fallos en la integración continua al actualizar a la toolchain Go 1.24.
El analizador existente de buildtag ahora informa sobre diagnósticos cuando hay un error. en la restricción de construcción de versiones anteriores. Go en la directiva //go:build. Por ejemplo, //go:build go1.23.1 se refiere a una versión puntual; en su lugar, use //go:build go1.23. #64127.
El analizador existente copylock ahora informa sobre diagnósticos cuando una variable declarada en un bucle triple ‘for’, como for i := iter(); done(i); i = next(i) { … }, contiene un sync.Locker como sync.Mutex. Go 1.22 cambió el comportamiento de tales bucles para crear una nueva variable en cada iteración, copiando valores de la iteración anterior; esta copia no es segura para los locks. #66387.
GOCACHEPROG
El binario interno cmd/go y el mecanismo de caché de pruebas ahora pueden ser implementados por procesos secundarios que implementen el protocolo JSON entre la herramienta cmd/go y un proceso secundario llamado por la variable de entorno GOCACHEPROG. Antes, esto estaba bajo GOEXPERIMENT. Los detalles del protocolo se pueden ver en la documentación.
Tiempo de ejecución
Varias mejoras de rendimiento en el tiempo de ejecución han reducido el costo de CPU en un 2-3% en promedio entre un conjunto de benchmarks representativos. Los resultados pueden variar según la aplicación. Estas mejoras incluyen una nueva implementación integrada de map basada en Tablas Suecas, una asignación de memoria más eficiente para objetos pequeños y una nueva implementación interna de mutex del tiempo de ejecución.
La nueva implementación integrada de map y el nuevo mutex interno del tiempo de ejecución se pueden desactivar con las configuraciones GOEXPERIMENT=noswissmap y GOEXPERIMENT=nospinbitmutex respectivamente durante la compilación.
Compilador
El compilador ya prohibía definir nuevos métodos con tipos de receptor que fueron generados por cgo, pero era posible eludir esta restricción a través de un alias de tipo. Go 1.24 ahora siempre informa un error si el receptor designa un tipo generado por cgo, ya sea directa o indirectamente (a través de un alias de tipo).
Vinculador
El vinculador ahora genera un identificador de construcción GNU (registro ELF NT_GNU_BUILD_ID) en plataformas ELF y UUID (comando de carga Mach-O LC_UUID) en macOS por defecto. El identificador de construcción o UUID se deriva del identificador de construcción de Go. Esto se puede desactivar con la bandera del vinculador -B none, o sobrescribir con la bandera del vinculador -B 0xNNNN con un valor hexadecimal especificado por el usuario.
Despliegue
Como se indicó en las notas de versión de Go 1.22, Go 1.24 ahora requiere Go 1.22.6 o posterior para su compilación. Los desarrolladores esperan que Go 1.26 requiera un lanzamiento puntual de Go 1.24 o posterior para compilar.
Biblioteca estándar
Acceso a la sistema de archivos restringido por directorio
Nuevo tipo os.Root permite realizar operaciones con el sistema de archivos dentro de un directorio específico.
La función os.OpenRoot abre un directorio y devuelve os.Root. Los métodos en os.Root operan en este directorio y no permiten que las rutas se refieran a ubicaciones fuera del directorio, incluyendo aquellas que siguen enlaces simbólicos fuera del directorio. Los métodos en os.Root reflejan la mayoría de las operaciones del sistema de archivos disponibles en el paquete os, incluyendo, por ejemplo, os.Root.Open, os.Root.Create, os.Root.Mkdir y os.Root.Stat.
Nueva función de benchmark
Los benchmarks ahora pueden utilizar un método más rápido y menos propenso a errores testing.B.Loop para realizar iteraciones en el benchmark como for b.Loop() { … } en lugar de las típicas estructuras de bucle con b.N como for range b.N. Esto ofrece dos ventajas significativas:
- La función de benchmark se ejecuta exactamente una vez por cada -count, por lo que los costosos pasos de configuración y limpieza se realizan solo una vez.
- Los parámetros de llamada a la función y los resultados permanecen activos, evitando que el compilador optimice completamente el cuerpo del bucle.
Finalizadores mejorados
Nueva función runtime.AddCleanup es un mecanismo de limpieza que es más flexible, más eficiente y menos propenso a errores que runtime.SetFinalizer. AddCleanup adjunta una función de limpieza a un objeto, que se ejecutará tan pronto como el objeto ya no esté disponible. Sin embargo, a diferencia de SetFinalizer, se pueden adjuntar múltiples limpiezas a un mismo objeto, las limpiezas pueden ser adjuntadas a punteros internos, las limpiezas normalmente no causan fugas cuando los objetos forman un ciclo, y las limpiezas no retrasan la liberación del objeto o los objetos a los que apunta. El nuevo código debe preferir AddCleanup a SetFinalizer.
Nuevo paquete weak
Nuevo paquete weak proporciona punteros débiles.
Los punteros débiles son un primitivo de bajo nivel proporcionado para crear estructuras que utilizan memoria de manera eficiente, como diccionarios débiles para mapear valores, diccionarios de canonización para cualquier cosa que no esté cubierta por el paquete unique, y varios tipos de cachés. Para apoyar estos casos de uso, esta versión también proporciona runtime.AddCleanup y maphash.Comparable.
Nuevo paquete crypto/mlkem
Nuevo paquete crypto/mlkem implementa ML-KEM-768 y ML-KEM-1024.
ML-KEM es un mecanismo de intercambio de claves post-cuántico, anteriormente conocido como Kyber y especificado en FIPS 203.
Nuevos paquetes crypto/hkdf, crypto/pbkdf2 y crypto/sha3
Nuevo paquete crypto/hkdf implementa la función de salida de clave basada en HMAC “Extract-and-Expand” HKDF, como se define en RFC 5869.
Nuevo paquete crypto/pbkdf2 implementa la función de salida de clave basada en contraseña PBKDF2, como se define en RFC 8018.
Nuevo paquete crypto/sha3 implementa la función hash SHA-3 y SHAKE y las funciones de salida extensible cSHAKE, como se define en FIPS 202.
Los tres paquetes se basan en paquetes existentes de golang.org/x/crypto/…
Cumplimiento FIPS 140-3
Esta versión incluye un nuevo conjunto de mecanismos para garantizar el cumplimiento de FIPS 140-3.
El módulo criptográfico de Go es un conjunto de paquetes internos de la biblioteca estándar que se utilizan de manera transparente para implementar algoritmos aprobados por FIPS 140-3. Las aplicaciones no requieren cambios para utilizar el módulo criptográfico de Go para algoritmos aprobados.
La nueva variable de entorno GOFIPS140 se puede utilizar para seleccionar la versión del módulo criptográfico de Go a utilizar en la compilación. La nueva configuración de GODEBUG fips140 se puede utilizar para habilitar el modo FIPS 140-3 durante la ejecución.
Go 1.24 incluye el módulo criptográfico de Go versión v1.0.0, que actualmente se está probando con un laboratorio acreditado de CMVP.
Nuevo paquete experimental testing/synctest
Nuevo paquete experimental testing/synctest proporciona soporte para la prueba de código concurrente.
- La función synctest.Run ejecuta un grupo de gorutinas en un ‘burbuja’ aislada. En la burbuja, las funciones del paquete time operan en relojes falsos.
- Funciones synctest.Wait espera a que todas las gorutinas se bloqueen en la burbuja actual.
Los detalles se pueden ver en la documentación del paquete.
El paquete synctest es experimental y debe ser habilitado configurando GOEXPERIMENT=synctest. La API del paquete puede cambiar en futuras versiones. En #67434 se pueden ver más detalles y proporcionar comentarios.
Cambios menores en la biblioteca
archive
Las implementaciones (*Writer.AddFS) en archive/zip y archive/tar ahora escriben el encabezado del directorio para un directorio vacío.
bytes
Paquete bytes agrega varias funciones que trabajan con iteradores:
- Lines devuelve un iterador de líneas separadas por nueva línea en un slice de bytes.
- SplitSeq devuelve un iterador sobre todas las sublistas de un slice de bytes, separado por un delimitador.
- SplitAfterSeq devuelve un iterador sobre las sublistas de un slice de bytes, separado después de cada ocurrencia del delimitador.
- FieldsSeq devuelve un iterador sobre las sublistas de un slice de bytes alrededor de las secuencias de caracteres de espacio, como se define unicode.IsSpace
- FieldsFuncSeq devuelve un iterador sobre las sublistas de un slice de bytes alrededor de las secuencias de puntos de código Unicode que cumplen con el predicado.
crypto/aes
El valor devuelto NewChipher ya no implementa los métodos NewCTR, NewGCM, NewCBCEncrypter y NewCBCDecrypter. Estos métodos no estaban documentados y no estaban disponibles en todas las arquitecturas. Ahora el valor Block debe pasarse directamente a las funciones correspondientes crypto/cipher. En este momento, crypto/cipher aún verifica estos métodos en los valores Block, incluso si ya no son compatibles con la biblioteca estándar.
crypto/cipher
Nueva función NewGCMWithRandomNonce devuelve AEAD, que implementa AES-GCM, generando un número único aleatorio durante Seal y añadiéndolo al inicio del texto cifrado.
Implementación Stream, devuelto NewCTR al usar con crypto/aes ahora es varias veces más rápido en amd64 y arm64.
NewOFB, NewCFBEncrypter y NewCFBDecrypter ahora se han declarado obsoletos. Los modos OFB y CFB no son autenticados, lo que en general permite que ataques activos manipulen y restauren texto plano. Se recomienda a las aplicaciones usar AEAD en su lugar. Si se requiere un modo no autenticado Stream se puede usar NewCTR en su lugar.
crypto/ecdsa
PrivateKey.Sign ahora crea una firma determinista de acuerdo con RFC 6979, si la fuente de aleatoriedad es nil.
crypto/md5
El valor devuelto md5.New, ahora también implementa la interfaz encoding.BinaryAppender.
crypto/rand
La función Read ahora garantiza la ausencia de fallos. Si Read encuentra un error durante la lectura Reader, el programa finalizará de forma irreversible. Tenga en cuenta que el Reader predeterminado está documentado para funcionar siempre con éxito, por lo que este cambio solo debería afectar a aquellos programas que redefinen la variable Reader. Una excepción son los núcleos de Linux anteriores a la versión 3.17, donde el Reader predeterminado aún abre /dev/urandom y puede fallar.
En Linux 6.11 y posteriores, el Reader ahora utiliza la llamada al sistema getrandom a través de vDSO. Esto es varias veces más rápido, normalmente para lecturas pequeñas.
En OpenBSD, el Reader ahora utiliza arc4random_buf(3).
Nueva función Text ahora puede generar cadenas de texto aleatorias criptográficamente seguras.
crypto/rsa
GenerateKey ahora devuelve un error si se solicita una clave de menos de 1024 bits. Todos los métodos Sign, Verify, Encrypt y Decrypt ahora devuelven un error si se utilizan con una clave de tamaño inferior a 1024 bits. Estas claves no son seguras y no deben ser utilizadas. Configuración de GODEBUG rsa1024min=0 restaura el comportamiento anterior, pero los desarrolladores de Go recomiendan hacerlo solo si es necesario y únicamente en pruebas, por ejemplo, agregando la línea \/\/go:debug rsa1024min=0 en el archivo de prueba. Nuevo ejemplo GenerateKey proporciona una clave de prueba estándar de 2024 bits fácil de usar.
Ahora es seguro y más eficiente llamar a PrivateKey.Precompute hasta PrivateKey.Validate. Precompute ahora es más rápido en presencia de PrecomputedValues, por ejemplo, al extraer una clave de JSON.
El paquete ahora rechaza más claves incorrectas, incluso cuando Validate no se llama, y GenerateKey ahora puede devolver nuevos errores para fuentes de aleatoriedad defectuosas. Los campos Primes y Precomputed de la estructura PrivateKey ahora se utilizan y validan incluso cuando faltan algunos valores. También se realizaron cambios en crypto/x509 sobre el análisis y extracción de claves RSA, descritos a continuación.
SignPKCS1v15 y VerifyPKCS1v15 ahora admiten SHA-512/224, SHA-512/256 y SHA-3.
GenerateKey ahora utiliza un método ligeramente diferente para generar la exponente privada (función de Carmichael en lugar de función de Euler). Aplicaciones raras que recrean claves solo a partir de números primos pueden producir resultados diferentes, pero compatibles.
Las operaciones sobre claves públicas y privadas ahora son hasta dos veces más rápidas en wasm.
crypto/sha*
- crypto/sha1: el valor devuelto por sha1.New ahora también implementa la interfaz encoding.BinaryAppender.
- crypto/sha256: los valores devueltos por sha256.New y sha256.New224 ahora también implementan la interfaz encoding.BinaryAppender.
- crypto/sha512: los valores devueltos por sha512.New, sha512.New384, sha512.New512_224 y sha512.New512_256, ahora también implementan la interfaz encoding.BinaryAppender.
crypto/subtle
Nueva función WithDataIndependentTiming permite al usuario ejecutar una función con características específicas de la arquitectura que garantizan la inmutabilidad de ciertas instrucciones en relación con el tiempo de los valores de los datos. Esto puede utilizarse para asegurarse de que el código diseñado para ejecutarse en tiempo constante no ha sido optimizado por características del nivel del procesador de tal manera que funcione en tiempo variable. Actualmente, WithDataIndependentTiming utiliza el bit PSTATE.DIT en arm64 y no hace nada en todas las demás arquitecturas. Configuración de GODEBUG dataindependenttiming=1 activa el modo DIT en todo el programa Go.
Salida XORBytes debe superponerse completamente o no hacerlo en absoluto con la entrada. El comportamiento anterior era indefinido en caso contrario, mientras que ahora XORBytes generará un pánico.
crypto/tls
El servidor TLS ahora admite Encrypted Client Hello (ECH). Esta característica puede habilitarse completando el campo Config.EncryptedClientHelloKeys.
Un nuevo mecanismo de intercambio de claves post-cuántico X25519MLKEM768 ahora es compatible y está habilitado por defecto cuando Config.CurvePreferences es nil. Configuración de GODEBUG tlsmlkem=0 devuelve el valor por defecto.
Se eliminó el soporte para el intercambio de claves experimental X25519Kyber768Draft00.
El orden de intercambio de claves ahora se maneja completamente por el paquete crypto/tls. El orden Config.CurvePreferences ahora se ignora, y el contenido se utiliza solo para determinar qué intercambios de clave incluir, cuando el campo está completo.
Un nuevo campo ClientHelloInfo.Extensions enumera la lista de identificadores de extensiones recibidos en el mensaje Client Hello. Esto puede ser útil para la huella digital de clientes TLS.
crypto/x509
Configuración de GODEBUG x509sha1 ha sido eliminado. Certficicate.Verify ya no admite firmas basadas en SHA-1.
OID ahora implementa las interfaces encoding.BinaryAppender y encoding.TextAppender.
El campo por defecto de políticas de certificados se ha cambiado de Certificate.PolicyIdentifiers en Certificate.Policies. Al analizar certificados, ambos campos estarán llenos, pero al crear políticas de certificados se tomarán del campo Certificate.Policies en lugar de Certificate.PolicyIdentifiers. Este cambio puede revertirse con la configuración GODEBUG x509usepolicies=0.
CreateCertificate ahora generará un número de serie utilizando un método compatible con RFC 5280 al pasar la plantilla por el campo Certificate.SerialNumber nil, en lugar de fallar.
Certificate.Verify ahora admite la validación de políticas, como se define en RFC 5280 y RFC 9618. El nuevo campo VerifyOptions.CertificatePolicies puede establecerse en un conjunto aceptable de políticas OIDs. Solo se devolverán las cadenas de certificados con gráficos de políticas válidos de Certificate.Verify.
MarshalPKCS8PrivateKey ahora devuelve un error en lugar de extraer una clave RSA incorrecta. (MarshalPKCS1PrivateKey no tiene un retorno de error y su comportamiento con claves incorrectas proporcionadas sigue siendo indefinido.)
ParsePKCS1PrivateKey y ParsePKCS8PrivateKey ahora utilizan y validan los valores codificados CRT, por lo que pueden rechazar claves RSA incorrectas que anteriormente eran aceptadas. El uso de la configuración GODEBUG x509rsacrt=0 vuelve a calcular los valores CRT.
debug/elf
Paquete debug/elf añade soporte para el manejo de versiones de símbolos en archivos ELF (Formato Ejecutable y Enlazable). El nuevo método File.DynamicVersions devuelve una lista de versiones dinámicas definidas en el archivo ELF. El nuevo método File.DynamicVersionNeeds devuelve una lista de versiones dinámicas requeridas por este archivo ELF, que están definidas en otros objetos ELF. Finalmente, nuevos campos Symbol.HasVersion y Symbol.VersionIndex indican la versión del símbolo.
encoding
Se introdujeron dos nuevas interfaces TextAppender y BinaryAppender para agregar la representación textual o binaria de un objeto a un slice de bytes. Estas interfaces proporcionan la misma funcionalidad que TextMarshaler y BinaryMarshaler, pero en lugar de asignar un nuevo slice cada vez, añaden datos directamente al slice existente. Estas interfaces ahora son implementadas por tipos de la biblioteca estándar que ya implementan TextMarshaler y/o BinaryMarshaler.
encoding/json
Al construir, el campo de la estructura con la nueva opción omitzero en la etiqueta del campo se omitirá si su valor es cero. Si el tipo de campo tiene un método IsZero() bool, se usará para determinar si el valor es cero. De lo contrario, el valor será cero si es un valor nulo para su tipo. La etiqueta de campo omitzero es más limpia y menos propensa a errores que omitempty cuando la intención es omitir valores nulos. En particular, a diferencia de omitempty, omitzero omite los time.Time valores, que son una fuente frecuente de problemas.
Si se especifican tanto omitempty como omitzero, el campo se omitirá si el valor está vacío o es nulo (o ambos a la vez).
UnmarshalTypeError.Field ahora incluye estructuras incorporadas para proporcionar mensajes de error más detallados.
go/types
Todas las estructuras de datos go/types que revelan secuencias de pares de métodos, como Len() int y At(int) T, ahora también tienen métodos que devuelven iteradores, lo que simplifica el código como este:
params := fn.Type.(*types.Signature).Params() for i := 0; i < params.Len(); i++ { use(params.At(i)) }
Para esto:
for param := range fn.Signature().Params().Variables() { use(param) }
Métodos: Interface.EmbeddedTypes Interface.ExplicitMethods Interface.Methods MethodSet.Methods Named.Methods Scope.Children Struct.Fields Tuple.Variables TypeList.Types TypeParamList.TypeParams Union.Terms
hash/*
- hash/adler32: el valor devuelto por Nuevo, ahora también implementa la interfaz encoding.BinaryAppender
- hash/crc32: los valores devueltos por Nuevo y NewIEEE, ahora también implementan la interfaz encoding.BinaryAppender
- hash/crc64: el valor devuelto por Nuevo, ahora también implementa la interfaz encoding.BinaryAppender
- hash/fnv: los valores devueltos por New32 New32a New64 New64a New128 y New128a, ahora también implementan la interfaz encoding.BinaryAppender
- hash/maphash: nuevas funciones Comparable y WriteComparable pueden calcular el hash de cualquier valor que sea comparable. Esto permite hacer hash de cualquier cosa que pueda usarse como clave en un diccionario Go.
log/slog
Nuevo DiscardHandler es un manejador que nunca está habilitado y siempre descarta su salida.
Nivel y LevelVar ahora implementan la interfaz encoding.TextAppender.
math/*
- math/big: Float, Int y Rat ahora implementan la interfaz encoding.TextAppender.
- math/rand: llamadas a funciones de alto nivel obsoletas Seed ya no tienen efecto. Para restaurar el comportamiento anterior se puede usar la configuración GODEBUG randseednop=0. Más contexto en la propuesta 67273.
- math/rand/v2: ChaCha8 y PCG ahora implementan la interfaz encoding.BinaryAppender.
net
ListenConfig ahora utiliza MPTCP por defecto en sistemas donde es compatible (actualmente solo Linux).
IP ahora implementa la interfaz encoding.TextAppender.
net/http
Se cambió el límite Transport en las respuestas informativas 1xx a la solicitud. Anteriormente, esto detenía la solicitud y devolvía un error después de recibir más de 5 respuestas 1xx. Ahora devuelve un error solo si el tamaño total de todas las respuestas 1xx excede la configuración Transport.MaxResponseHeaderBytes.
Además, cuando la solicitud tiene un gancho para rastrear net/http/httptrace.ClientTrace.Got1xxResponse, ahora no hay límite en el número total de respuestas 1xx. El gancho Got1xxResponse puede devolver un error para detener la solicitud.
Transport y Servidor ahora tiene un campo HTTP2 que permite la configuración de los ajustes del protocolo HTTP/2.
Los nuevos campos Server.Protocols y Transport.Protocols ofrecen una forma sencilla de configurar qué protocolos usa el servidor o el cliente HTTP.
El servidor y el cliente pueden configurarse para admitir conexiones HTTP/2 sin cifrar.
Cuando Server.Protocols contiene UnencrypterHTTP2, el servidor aceptará conexiones HTTP/2 en puertos no cifrados. El servidor puede aceptar simultáneamente HTTP/1 y HTTP/2 sin cifrar en el mismo puerto.
Cuando Transport.Protocols contiene UnencryptedHTTP2 y no contiene HTTP1, el transporte utilizará HTTP/2 sin cifrar para las direcciones http://. Si el transporte está configurado para usar tanto HTTP/1 como HTTP/2 sin cifrado, utilizará HTTP/1.
El soporte de HTTP/2 sin cifrado utiliza "HTTP/2 con conocimiento previo" (RFC 9113, sección 3.3). El encabezado obsoleto "Upgrade: h2c" no es compatible.
net/netip
Addr, AddrPort y Prefix ahora implementan interfaces encoding.BinaryAppender y encoding.TextAppender.
net/url
URL ahora también implementa la interfaz encoding.BinaryAppender.
os/user
En Windows Actual ahora puede ser utilizado en Windows Nano Server. La implementación fue actualizada para evitar el uso de funciones de la biblioteca NetApi32, que no está disponible en Nano Server.
En Windows Actual, Lookup y LookupId ahora soportan las siguientes cuentas de servicio integradas:
- NT AUTHORITYSYSTEM
- NT AUTHORITYLOCAL SERVICE
- NT AUTHORITYNETWORK SERVICE
En Windows Actual se ha acelerado significativamente cuando el usuario actual está conectado a un dominio lento, lo cual es común para muchos usuarios corporativos. El nuevo rendimiento de la implementación ahora es del orden de milisegundos, en comparación con la implementación anterior, que podía llevar varios segundos, incluso minutos, en completarse.
En Windows Actual ahora devuelve al usuario propietario del proceso, cuando el hilo actual se hace pasar por otro usuario. Anteriormente, esto devolvía un error.
regexp
Regexp ahora implementa la interfaz encoding.TextAdapter.
runtime
La función GOROOT ahora está declarada obsoleta. En el nuevo código se debe preferir el uso de la ruta del sistema para determinar el binario "go", y usar go env GOROOT para determinar GOROOT.
strings
Paquete strings agrega varias funciones para trabajar con iteradores:
- Lines devuelve un iterador para las líneas separadas por nueva línea en la cadena.
- SplitSeq devuelve un iterador para todas las subcadenas de la cadena, separadas por el separador.
- SplitAfterSeq devuelve un iterador para las subcadenas de la cadena, separadas después de cada aparición del separador.
- FieldsSeq devuelve un iterador para las subcadenas de la cadena alrededor de secuencias de caracteres de espacio, tal como se defineunicode.IsSpace
- FieldsFuncSeq devuelve un iterador para las subcadenas de la cadena alrededor de secuencias de puntos de código Unicode que cumplen con el predicado.
sync
Implementación sync.Map fue modificada, mejorando el rendimiento, especialmente para cambios en el diccionario. Por ejemplo, es menos probable que haya competencia por cambios en conjuntos no superpuestos en diccionarios grandes, y ya no se requiere tiempo de acumulación para lograr un diccionario de baja competencia.
Si encuentras algún problema, establece GOEXPERIMENT=nosynchashtriemap al compilar para volver a la implementación anterior y, por favor, completa el formulario de problemas.
testing
Nuevos métodos T.Context y B.Context devuelven el contexto que se cancela al finalizar la prueba y antes de ejecutar las funciones de limpieza de la prueba.
Nuevos métodos T.Chdir y B.Chdir se pueden utilizar para cambiar el directorio de trabajo durante la ejecución de la prueba o el benchmark.
text/template
Las plantillas ahora soportan range-over-func y range-over-int.
time
Tiempo ahora implementa las interfaces encoding.BinaryAppender y encoding.TextAppender.
Puertos
Linux
Como fue que en las notas de la versión Go 1.23, Go 1.24 requiere el núcleo de Linux versión 3.2 o superior.
Darwin
Go 1.24 es la última versión que funcionará en macOS 11 Big Sur. Go 1.25 requerirá macOS 12 Monterey o superior.
WebAssembly
La directiva del compilador go:wasmexport se ha añadido a los programas Go para exportar funciones al host de WebAssembly.
En la Vista Previa de la Interfaz del Sistema WebAssembly 1 (GOOS=wasip1 GOARCH=wasm) Go 1.24 soporta la compilación de programas Go como reactor/library a través de la especificación del flag de compilación -buildmode=c-shared.
Más tipos ahora están permitidos como tipo de argumento o resultado para las funciones go:wasmimport. En particular, bool, string, uintptr y punteros a ciertos tipos son permitidos (los detalles se pueden ver en la documentación), junto con tipos de enteros de 32 y 64 bits y de punto flotante, y unsafe.Pointer, que ya están permitidos. Estos tipos también están permitidos como tipos de argumento o resultado para las funciones go:wasmexport.
Los archivos de soporte para WebAssembly se han movido a lib/wasm desde misc/wasm.
El tamaño de memoria original se ha reducido significativamente, especialmente para aplicaciones pequeñas de WebAssembly.
Windows
El puerto windows/arm de 32 bits (GOOS=windows GOARCH=arm) ha sido marcado como roto. Los detalles en #70705
Fuente: linux.org.ru
