Go 1.27: métodos genéricos y JSON v2 en la stdlib
Se suman tres cambios al lenguaje, mejoras en el toolchain y una versión nueva de encoding/json. Repasamos qué cambia en el código que escribís día a día.
Métodos genéricos
Ahora podés declarar un método con su propio parámetro de tipo, algo que antes no existía en Go. El ejemplo de math/rand/v2.Rand muestra el caso típico: en vez de tener un método distinto por cada tipo entero (Int32N, Int64N, IntN), podés escribir uno solo genérico que cubra todos.
// Antes de Go 1.27, había que repetir el método por cada tipofunc (r *Rand) Int32N(n int32) int32func (r *Rand) Int64N(n int64) int64func (r *Rand) IntN(n int) int// Go 1.27 agrega un método genérico que sirve para todos los enterosfunc (r *Rand) N[Int intType](n Int) IntClaves anidadas en struct literals
Al inicializar un struct, ahora podés usar como clave cualquier selector de campo válido, incluyendo campos de structs embebidos. Esto evita tener que asignar el struct anidado por separado cuando solo querés setear un campo interno.
type Habitat struct { Burrow string}type Gopher struct { Name string Habitat // Embedded struct.}// Go 1.27 permite usar Burrow como clave directamente.g := Gopher{ Name: "Gopher", Burrow: "Burrow #42",}Inferencia de tipos en más contextos
La inferencia de tipos de funciones genéricas ahora funciona en cualquier contexto de asignación, no solo en llamadas directas. Esto incluye literales compuestos, conversiones de tipo y envíos a canales, así que podés pasar una función genérica sin especificar el tipo a mano.
func GenericFormatter[T any](v T) string { return fmt.Sprintf("value: %v", v)}type IntFormatter func(int) string// Go 1.27 infiere T = int en literales compuestos, conversiones y envíos a canal.formatters := []IntFormatter{GenericFormatter}fn := IntFormatter(GenericFormatter)ch := make(chan IntFormatter, 1)ch <- GenericFormatterToolchain: go fix, go doc y go mod tidy
go fix suma cuatro modernizers nuevos: atomictypes, embedlit, slicesbackward y unsafefuncs. go doc ahora acepta consultas con versión, como go doc example.com/pkg@v1.2.3. Y go mod tidy consolida automáticamente los bloques require de tu go.mod en la estructura estándar de dos bloques (directo e indirecto).
Rendimiento, runtime y biblioteca estándar
La asignación de memoria para objetos chicos (menos de 80 bytes) usa ahora tamaños especializados, lo que reduce su costo hasta un 30% y mejora en cerca de 1% el rendimiento general en programas que asignan mucho. El perfil goroutineleak de runtime/pprof pasa a ser estable, para detectar goroutines bloqueadas de forma permanente. En la stdlib aparece encoding/json/v2 con opciones configurables y defaults más estrictos (el encoding/json actual ya usa esta implementación por debajo para desunmarshaling más rápido), además de crypto/mldsa para firmas post-cuánticas ML-DSA, un paquete uuid nativo, soporte experimental de SIMD y NewTestServer en net/http/httptest para testear con red simulada.
Qué te llevas
Los métodos genéricos eliminan la necesidad de duplicar código por cada tipo, como se ve en math/rand/v2.
Podés inicializar campos de structs embebidos directamente por su nombre, sin anidar el literal.
encoding/json/v2 llega con defaults más estrictos y ya acelera el unmarshaling del paquete json actual.
go mod tidy y go doc traen mejoras chicas pero prácticas para el trabajo diario con módulos.
¿Quieres una clase de esto?
Si varias personas lo piden, entra al programa. No hace falta dejar mail ni nombre.