Go 1.27: métodos genéricos, encoding/json v2 e assinaturas pós-quânticas

O Go 1.27 saiu em 19 de agosto de 2026, e é uma daquelas versões que mexem em coisas que a comunidade pede há anos. Métodos genéricos finalmente chegaram, o encoding/json ganhou uma implementação nova por baixo e a biblioteca padrão entrou de vez na criptografia pós-quântica. Li o anúncio no blog do Go e as notas de lançamento, e separo aqui o que mais importa no dia a dia.

Métodos genéricos

Desde que os genéricos chegaram à linguagem, uma limitação incomodava: métodos não podiam declarar seus próprios parâmetros de tipo. No Go 1.27, podem. O exemplo das notas é o math/rand/v2, que agora tem um método genérico N em *Rand, antes disponível só como função genérica:

func (*Rand) N[Int intType](Int) Int

A restrição importante: métodos de interface continuam sem poder declarar parâmetros de tipo, e métodos de interface não podem ser implementados por métodos genéricos. Ou seja, dá para escrever APIs mais naturais em tipos concretos, mas não dá para abstrair isso por interface. É uma escolha conservadora, bem no estilo do Go.

O blog também cita duas melhorias menores na linguagem: chaves em literais de struct agora podem ser qualquer seletor de campo válido, o que permite inicializar campos de structs embutidas diretamente, e funções genéricas podem ser usadas sem argumentos de tipo explícitos em literais compostos, conversões e envios para canais.

encoding/json v2

Chegaram dois pacotes novos: encoding/json/v2, para processamento de JSON de alto nível com opções configuráveis, e encoding/json/jsontext, para processamento de mais baixo nível com Encoder, Decoder, Token e Value. O v2 é mais rígido por padrão: rejeita UTF-8 inválido em strings e nomes duplicados dentro de um objeto.

O detalhe que afeta todo mundo: o encoding/json original agora é implementado sobre o v2. Segundo as notas, o desempenho de marshal fica no mesmo nível e o unmarshal fica bem mais rápido, mantendo compatibilidade. Se algo quebrar, dá para voltar à implementação antiga no build:

GOEXPERIMENT=nojsonv2 go build

As notas avisam que essa opção deve ser removida em uma versão futura, então ela serve para ganhar tempo, não como solução definitiva.

Criptografia, uuid e SIMD

O pacote crypto/mldsa implementa o esquema de assinatura pós-quântico ML-DSA, especificado no FIPS 204. Ele está integrado ao crypto/x509, que passa a suportar chaves e assinaturas ML-DSA, e ao crypto/tls, com os novos valores MLDSA44, MLDSA65 e MLDSA87 para TLS 1.3. Para quem precisa se preparar para requisitos de criptografia pós-quântica, ter isso na biblioteca padrão é um alívio.

Há também um pacote uuid novo, que gera e faz parse de UUIDs, e deve eliminar uma das dependências mais comuns em projetos Go. Para quem gosta de performance, há suporte experimental a SIMD com os pacotes simd e simd/archsimd, habilitados com GOEXPERIMENT=simd.

Runtime e ferramentas

O compilador agora gera chamadas de alocação especializadas por tamanho, reduzindo em até 30% o custo de algumas alocações pequenas, de menos de 80 bytes. As notas são honestas sobre o efeito real: cerca de 1% de melhora em programas que alocam muito, com binários cerca de 60 KB maiores.

O profile goroutineleak, experimental no Go 1.26, agora está disponível de forma geral no runtime/pprof e no endpoint /debug/pprof/goroutineleak, para detectar goroutines bloqueadas para sempre. A configuração GODEBUG asynctimerchan foi removida, e os canais criados pelo pacote time agora são sempre sem buffer.

Nas ferramentas, o go fix ganhou os modernizadores atomictypes, embedlit, slicesbackward e unsafefuncs, e o go mod tidy passa a consolidar blocos require em no máximo dois, um para dependências diretas e outro para indiretas. Também chegaram bytes.CutLast e strings.CutLast, o pacote unicode foi atualizado para o Unicode 17 e o Go agora exige macOS 13 Ventura ou superior.

Minha leitura

Métodos genéricos são a manchete, mas acho que o impacto maior no curto prazo vem do JSON. Todo programa Go que faz unmarshal de JSON vai rodar sobre uma implementação nova sem mudar uma linha, e isso é ótimo quando funciona e assustador quando não funciona. Eu rodaria a suíte de testes com atenção especial a payloads com UTF-8 estranho ou chaves duplicadas antes de subir em produção.

O resto segue a tradição do Go: melhorias concretas, números modestos e honestos sobre performance e pouca mágica. O pacote uuid e o ML-DSA na biblioteca padrão são o tipo de coisa que não rende manchete, mas reduz dependência e risco em projetos reais.

Fontes