Go 1.27 adiciona métodos genéricos e um encoding/json mais rápido
O Go 1.27 saiu a 19 de agosto de 2026 com métodos genéricos, um motor v2 sob o encoding/json, perfis de fugas de goroutines e assinaturas pós-quânticas.
4 min de leitura

O Go 1.27 saiu a 19 de agosto de 2026 e muda a própria linguagem. Os métodos passam a poder declarar os seus próprios parâmetros de tipo, algo que o Go recusava desde a chegada dos genéricos. Nicholas Husin anunciou a versão no blogue do Go em nome da equipa.
Outras duas mudanças chegarão a mais programas do que o trabalho sobre a linguagem. O pacote JSON padrão corre sobre um motor novo, e o runtime consegue dizer que goroutines fugiram.
Métodos genéricos, e o seu único limite
Antes desta versão, um tipo podia ser genérico mas os seus métodos não podiam acrescentar parâmetros de tipo próprios. Os autores escreviam um método por cada tipo concreto.
As notas de versão apontam o math/rand/v2.Rand como exemplo. O seu método lê-se agora (*Rand) N[Int intType](Int) Int. Um único método cobre todos os tipos inteiros.
Há uma restrição firme. Os métodos de interface não podem declarar parâmetros de tipo, por isso um método genérico não pode implementar um método de interface. Essa fronteira é deliberada e não é uma lacuna temporária.
Duas mudanças de linguagem menores vêm junto. Uma chave num literal de estrutura "may now be any valid field selector for the struct type", o que permite definir campos aninhados e embutidos diretamente. E a inferência de tipos de funções "has been generalized to apply in all assignment contexts", incluindo literais compostos, conversões e envios em canal.
O encoding/json corre agora sobre v2
O pacote encoding/json assenta agora numa implementação v2. A API v1 fica, e as notas de versão dizem explicitamente que não está obsoleta. Não é preciso migrar.
Os valores por omissão ficaram mais rígidos, e é aí que código que funciona pode partir. O motor v2 rejeita UTF-8 inválido dentro de cadeias JSON. Rejeita também nomes duplicados num objeto JSON. Ambos passavam antes.
| Mudança | Efeito |
|---|---|
| UTF-8 inválido em cadeias | Passa a ser rejeitado |
| Chaves de objeto duplicadas | Passam a ser rejeitadas |
| Velocidade de Unmarshal | Bastante mais rápida |
| Velocidade de Marshal | Praticamente igual |
Tags format e unknown | Removidas na v2 |
Opção de tag inline | Renomeada para embed |
Se algo partir, GOEXPERIMENT=nojsonv2 repõe a implementação antiga na compilação. Trate isso como um prazo, não como uma solução. As notas de versão dizem que essa saída deverá ser removida numa versão futura.
Chegam com isto dois pacotes novos: encoding/json/v2, que aceita opções variádicas, e encoding/json/jsontext para trabalhar ao nível dos tokens.
Perfis de fugas, alocação e assinaturas pós-quânticas
O perfil de fugas de goroutines está agora geralmente disponível no runtime/pprof, depois de ter sido experimental no Go 1.26. Uma goroutine que fugiu é "a goroutine blocked on some concurrency primitive (channels, sync.Mutex, sync.Cond, etc) that cannot possibly become unblocked".
O runtime encontra-as através do coletor de lixo. Se uma goroutine bloqueada espera por algo que nenhuma goroutine executável consegue já alcançar, nunca acordará. Leia em /debug/pprof/goroutineleak. Tem um ponto cego declarado: fugas em primitivas alcançáveis por variáveis globais podem escapar.
A alocação ficou mais barata. O compilador passa a chamar rotinas de alocação especializadas por tamanho, cortando até 30% o custo das alocações abaixo de 80 bytes. As notas de versão colocam o ganho global em cerca de 1% para código intensivo em alocações, e o binário cresce cerca de 60 KB.
Para equipas de segurança, o crypto/mldsa implementa o ML-DSA, o esquema de assinatura pós-quântico da FIPS 204. O TLS 1.3 ganha os esquemas MLDSA44, MLDSA65 e MLDSA87, e o x509 trata das chaves.
O que isto significa para programadores
Leia as remoções antes de atualizar, porque é aí que está a quebra. O Go 1.27 exige agora macOS 13 Ventura ou posterior. Deixa cair o suporte ao sistema de controlo de versões bzr, por isso módulos alojados em bzr já não podem ser obtidos.
Várias saídas de emergência GODEBUG desapareceram, e uma delas muda o comportamento. Com a remoção de asynctimerchan, os canais criados pelo pacote time são agora sempre sem buffer. Se escreveu código em torno do comportamento com buffer, esse código corre sob outro contrato.
A mudança no JSON merece uma passagem por pré-produção, não apenas uma leitura. A análise mais rígida falha com dados que já aceita, e as chaves duplicadas chegam sobretudo de sistemas alheios, não dos seus testes. Aponte a nova compilação a cargas reais de produção antes de publicar.
Ligue o perfil de fugas mesmo que nada pareça errado. É gratuito, já é estável, e uma goroutine bloqueada para sempre retém a sua pilha e tudo o que a pilha referencia. Essa classe de erro raramente aparece como erro, apenas como memória que nunca volta.
Uma última verificação para quem faz coisas engenhosas com valores de função. O compilador gera nomes mais simples para closures, por isso testes que verificam nomes de símbolos podem precisar de ajuste. Código que compara ponteiros de função por igualdade sempre esteve errado, e esta versão expõe isso com mais frequência.
Fontes
- Go 1.27 is released - The Go Blog
- Go 1.27 Release Notes - go.dev
Artigos relacionados

Um binário strip adulterado pode abrir uma porta em todo o NixOS
Investigadores construíram o ataque trusting-trust de Ken Thompson a partir do GNU strip, e não de um compilador, e abriram portas em quase todos os binários de um instalador NixOS.

LLVM debate compilar o ClangIR por omissão
Uma RFC do LLVM propõe compilar o ClangIR dentro do Clang por omissão. Ninguém o usaria sem uma opção, mas há estimativas que duplicam os tempos de compilação.

Debian Code Search elimina a última dependência de cgo
Michael Stapelberg substituiu uma biblioteca em C com 7 anos por Go puro usando o pacote SIMD experimental, e igualou a velocidade da versão em C.