Saltar al contenido
Buscar
Ver todo el radar
Go 1.27

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.

go
// Antes de Go 1.27, había que repetir el método por cada tipo
func (r *Rand) Int32N(n int32) int32
func (r *Rand) Int64N(n int64) int64
func (r *Rand) IntN(n int) int
​
// Go 1.27 agrega un método genérico que sirve para todos los enteros
func (r *Rand) N[Int intType](n Int) Int

Claves 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.

go
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.

go
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 <- GenericFormatter

Toolchain: 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.

Este resumen lo escribimos a partir de las notas oficiales del release. Lo que no estaba ahí, no está acá.

Anuncio original de Go

¿Quieres una clase de esto?

Si varias personas lo piden, entra al programa. No hace falta dejar mail ni nombre.