Skip to content
Tech AI Wire

Go 1.27 añade métodos genéricos y un encoding/json más rápido

Go 1.27 salió el 19 de agosto de 2026 con métodos genéricos, un motor v2 bajo encoding/json, perfiles de fugas de goroutines y firmas poscuánticas.

Por Tech AI Wire Team

4 min de lectura

XLinkedIn
A terminal showing go version reporting go1.27 on darwin/arm64, beside a Go method declaration that carries its own type parameter.

Go 1.27 salió el 19 de agosto de 2026 y cambia el propio lenguaje. Los métodos ya pueden declarar sus propios parámetros de tipo, algo que Go rechazaba desde la llegada de los genéricos. Nicholas Husin anunció la versión en el blog de Go en nombre del equipo.

Otros dos cambios llegarán a más programas que el trabajo sobre el lenguaje. El paquete JSON estándar corre sobre un motor nuevo, y el runtime puede decirte qué goroutines se han fugado.

Métodos genéricos, y su única limitación

Antes de esta versión, un tipo podía ser genérico pero sus métodos no podían añadir parámetros de tipo propios. Los autores escribían un método por cada tipo concreto.

Las notas de versión señalan math/rand/v2.Rand como ejemplo. Su método ahora se lee (*Rand) N[Int intType](Int) Int. Un solo método cubre todos los tipos enteros.

Hay una restricción firme. Los métodos de interfaz no pueden declarar parámetros de tipo, así que un método genérico no puede implementar un método de interfaz. Ese límite es deliberado y no es un hueco temporal.

Le acompañan dos cambios de lenguaje menores. Una clave en un literal de estructura "may now be any valid field selector for the struct type", lo que permite fijar campos anidados e incrustados directamente. Y la inferencia de tipos de funciones "has been generalized to apply in all assignment contexts", incluidos literales compuestos, conversiones y envíos por canal.

encoding/json ahora corre sobre v2

El paquete encoding/json se apoya ahora en una implementación v2. La API v1 se queda, y las notas de versión dicen explícitamente que no está obsoleta. No hace falta migrar.

Los valores por defecto sí se volvieron más estrictos, y ahí es donde puede romperse código que funciona. El motor v2 rechaza UTF-8 inválido dentro de cadenas JSON. También rechaza nombres duplicados en un objeto JSON. Antes pasaban los dos.

CambioEfecto
UTF-8 inválido en cadenasAhora se rechaza
Claves de objeto duplicadasAhora se rechazan
Velocidad de UnmarshalBastante más rápida
Velocidad de MarshalMás o menos igual
Etiquetas format y unknownEliminadas en v2
Opción de etiqueta inlineRenombrada a embed

Si algo se rompe, GOEXPERIMENT=nojsonv2 restaura la implementación antigua al compilar. Trátalo como un plazo, no como un arreglo. Las notas de versión dicen que se espera retirar esa salida en una versión futura.

Llegan con ello dos paquetes nuevos: encoding/json/v2, que toma opciones variádicas, y encoding/json/jsontext para trabajar a nivel de tokens.

Perfiles de fugas, asignación y firmas poscuánticas

El perfil de fugas de goroutines ya está disponible de forma general en runtime/pprof, tras ser experimental en Go 1.26. Una goroutine fugada es "a goroutine blocked on some concurrency primitive (channels, sync.Mutex, sync.Cond, etc) that cannot possibly become unblocked".

El runtime las encuentra usando el recolector de basura. Si una goroutine bloqueada espera algo que ninguna goroutine ejecutable puede ya alcanzar, nunca despertará. Se lee en /debug/pprof/goroutineleak. Tiene un punto ciego declarado: puede pasar por alto fugas en primitivas accesibles a través de variables globales.

La asignación salió más barata. El compilador llama ahora a rutinas de asignación especializadas por tamaño, recortando hasta un 30% el coste de las asignaciones por debajo de 80 bytes. Las notas de versión cifran la ganancia de programa completo en torno al 1% para código intensivo en asignaciones, y el binario crece unos 60 KB.

Para equipos de seguridad, crypto/mldsa implementa ML-DSA, el esquema de firma poscuántico de FIPS 204. TLS 1.3 gana los esquemas MLDSA44, MLDSA65 y MLDSA87, y x509 maneja las claves.

Qué significa esto para los desarrolladores

Lee las eliminaciones antes de actualizar, porque ahí está la rotura. Go 1.27 exige ahora macOS 13 Ventura o posterior. Retira el soporte del sistema de control de versiones bzr, así que los módulos alojados en bzr ya no se pueden descargar.

Varias salidas de emergencia GODEBUG desaparecieron, y una de ellas cambia el comportamiento. Con asynctimerchan retirado, los canales que crea el paquete time son siempre sin búfer. Si escribiste código en torno al comportamiento con búfer, ese código corre bajo otro contrato.

El cambio de JSON merece una pasada por preproducción, no solo una lectura. El análisis más estricto falla con datos que ya aceptas, y las claves duplicadas suelen llegar de sistemas ajenos, no de tus pruebas. Apunta la nueva compilación a cargas reales de producción antes de publicar.

Activa el perfil de fugas aunque nada parezca ir mal. Es gratis, ya es estable, y una goroutine bloqueada para siempre retiene su pila y todo lo que la pila referencia. Esa clase de fallo rara vez aparece como error, solo como memoria que nunca vuelve.

Una última comprobación para quien hace cosas ingeniosas con valores de función. El compilador genera nombres más simples para los cierres, así que las pruebas que comprueban nombres de símbolos pueden necesitar ajuste. El código que compara punteros de función por igualdad siempre fue incorrecto, y esta versión lo deja al descubierto más a menudo.

Fuentes

  1. Go 1.27 is released - The Go Blog
  2. Go 1.27 Release Notes - go.dev

Artículos relacionados

A terminal showing a large C++ project compiling, with the CMake percentage counter partway through and object files scrolling past.
Coding

LLVM debate compilar ClangIR por defecto

Una RFC de LLVM propone compilar ClangIR dentro de Clang por defecto. Nadie lo usaría sin un indicador, pero hay estimaciones que doblan los tiempos de compilación.