Post
Disponível em: English

Go 1.26: tudo que mudou na nova versão

E aí, pessoal!

Go 1.26 chegou em fevereiro de 2026, seis meses depois do Go 1.25. E veio com mudanças que vão impactar diretamente a performance e a forma como você escreve código Go.

O destaque principal é o novo Green Tea garbage collector, agora ativado por padrão. Mas tem muito mais coisa interessante nessa versão.

Vamos ver o que mudou de verdade.

O que você vai encontrar aqui

Esta versão traz mudanças em quatro áreas principais:

  1. Mudanças na linguagem: new mais poderoso, generics mais flexíveis
  2. Novo garbage collector: Green Tea GC por padrão
  3. Ferramentas modernizadas: go fix completamente reescrito
  4. Melhorias nas bibliotecas: diversas melhorias no stdlib

Cada seção tem o que mudou e o impacto prático para o seu dia a dia.

1. Mudanças na linguagem

new aceita expressões como operando

A função built-in new agora permite que seu operando seja uma expressão, especificando o valor inicial da variável.

Isso é especialmente útil ao trabalhar com pacotes de serialização como encoding/json ou protocol buffers, que usam ponteiros para representar valores opcionais:

1
2
3
4
5
6
7
8
9
10
11
type Person struct {
    Name string `json:"name"`
    Age  *int   `json:"age"` // idade se conhecida; nil caso contrário
}

func personJSON(name string, born time.Time) ([]byte, error) {
    return json.Marshal(Person{
        Name: name,
        Age:  new(yearsSince(born)), // antes precisava de uma variável auxiliar
    })
}

Antes, você precisava criar uma variável auxiliar:

1
2
3
// Antes do Go 1.26
age := yearsSince(born)
person := Person{Name: name, Age: &age}

Agora ficou muito mais limpo e direto.

Generics: tipos podem se referenciar na lista de parâmetros

A restrição de que um tipo genérico não podia se referenciar em sua própria lista de parâmetros de tipo foi removida.

Agora é possível especificar constraints de tipo que se referem ao próprio tipo genérico sendo restringido:

1
2
3
4
5
6
7
type Adder[A Adder[A]] interface {
    Add(A) A
}

func algo[A Adder[A]](x, y A) A {
    return x.Add(y)
}

Antes, a auto-referência a Adder na primeira linha não era permitida. Isso torna os type constraints mais poderosos e simplifica as regras da spec para parâmetros de tipo.

2. Novo garbage collector: Green Tea GC

O que é o Green Tea GC

O Green Tea garbage collector, disponível como experimento no Go 1.25, agora está ativado por padrão no Go 1.26.

Este novo GC melhora a performance de marcação e varredura de objetos pequenos através de melhor localidade de memória e escalabilidade de CPU.

Impacto na performance

Os resultados dos benchmarks variam, mas a expectativa é:

1
2
3
4
5
6
7
┌─────────────────────────────────────────┐
│  Redução no overhead do GC              │
│                                         │
│  Geral:          10–40% menos overhead  │
│  CPUs modernas:  +10% adicional         │
│  (Intel Ice Lake / AMD Zen 4 ou mais)   │
└─────────────────────────────────────────┘

Em CPUs modernas (Intel Ice Lake ou AMD Zen 4 e mais recentes), o GC aproveita instruções vetoriais para varredura de objetos pequenos, adicionando ~10% a mais de melhoria.

Como desativar (se necessário)

Se você encontrar algum problema de performance ou comportamento, pode desativar:

1
GOEXPERIMENT=nogreenteagc go build .

Nota: Esta opção de desativação será removida no Go 1.27. Se você precisar desativar por alguma razão, reporte o problema em github.com/golang/go.

Outras melhorias no runtime

Chamadas cgo mais rápidas: O overhead base de chamadas cgo foi reduzido em ~30%.

Randomização do endereço base do heap: Em plataformas 64-bit, o runtime agora randomiza o endereço base do heap na inicialização. Isso é uma melhoria de segurança que dificulta para atacantes preverem endereços de memória ao usar cgo.

Goroutine leak profile (experimental): Um novo tipo de profile que reporta goroutines vazadas está disponível como experimento:

1
GOEXPERIMENT=goroutineleakprofile go build .

Uma goroutine “vazada” é aquela bloqueada em uma primitiva de concorrência (channels, sync.Mutex, sync.Cond, etc.) que não pode ser desbloqueada. O runtime detecta isso usando o garbage collector.

3. Ferramentas: go fix completamente reescrito

O novo go fix

O go fix foi completamente reformulado e agora é o lar dos modernizers do Go. Ele oferece uma forma confiável de atualizar bases de código Go para os idiomas e APIs mais recentes.

A suíte inicial de modernizers inclui:

  • Dezenas de fixers para usar features modernas da linguagem e biblioteca
  • Um inliner em nível de source que permite automatizar migrações de API usando diretivas //go:fix inline
1
2
# Moderniza automaticamente seu código
go fix ./...

Importante: Esses fixers não devem mudar o comportamento do seu programa.

O novo go fix é construído sobre o mesmo framework de análise do go vet. Isso significa que os mesmos analyzers que fornecem diagnósticos no go vet podem ser usados para sugerir e aplicar fixes no go fix.

Outras mudanças nas ferramentas

go mod init com versão mais baixa por padrão: Agora cria go.mod com uma versão anterior para encorajar compatibilidade com versões suportadas:

1
2
Go 1.26 → cria go.mod com go 1.25.0
Go 1.26 RC → cria go.mod com go 1.24.0

cmd/doc removido: O comando go tool doc foi removido. Use go doc como substituto direto (mesmos flags e comportamento).

pprof com flame graph por padrão: A interface web do pprof agora mostra o flame graph por padrão ao usar -http. O view anterior ainda está disponível em “View → Graph”.

4. Melhorias nas bibliotecas

log/slog: MultiHandler

Nova função NewMultiHandler que cria um handler que invoca múltiplos handlers:

1
2
3
4
5
handler := slog.NewMultiHandler(
    slog.NewJSONHandler(os.Stdout, nil),
    slog.NewTextHandler(logFile, nil),
)
logger := slog.New(handler)

io: ReadAll mais eficiente

io.ReadAll agora aloca menos memória intermediária e retorna um slice de tamanho mínimo:

  • ~2x mais rápido
  • ~50% menos memória alocada
  • Mais benefício para inputs maiores

reflect: iteradores para tipos e valores

Novos métodos que retornam iteradores:

1
2
3
4
// Iterar sobre campos de um struct
for field, value := range reflect.ValueOf(myStruct).Fields() {
    fmt.Println(field.Name, value)
}

Novos métodos: Type.Fields, Type.Methods, Type.Ins, Type.Outs, Value.Fields, Value.Methods.

net/http: melhorias HTTP/2

  • Novo campo HTTP2Config.StrictMaxConcurrentRequests para controlar abertura de novas conexões quando o limite de streams HTTP/2 é atingido
  • Client agora usa cookies com escopo correto para URLs com Request.Host

testing: diretório de artefatos

Novos métodos T.ArtifactDir, B.ArtifactDir e F.ArtifactDir para escrever arquivos de output de testes:

1
go test -artifacts ./...

image/jpeg: encoder e decoder mais rápidos

O encoder e decoder JPEG foram substituídos por implementações novas, mais rápidas e precisas.

Atenção: Código que espera output bit-a-bit específico pode precisar ser atualizado.

5. Mudanças de plataforma

macOS

Go 1.26 é a última versão que rodará no macOS 12 Monterey. Go 1.27 exigirá macOS 13 Ventura ou mais recente.

Resumo:

ÁreaMudançaImpacto
GCGreen Tea GC por padrão10–40% menos overhead
Linguagemnew com expressõesCódigo mais limpo
LinguagemGenerics auto-referênciaConstraints mais poderosos
Ferramentasgo fix reescritoModernização automática de código
Runtimecgo ~30% mais rápidoMelhor integração com C
ioReadAll 2x mais rápidoMenos alocações
macOSÚltima versão com macOS 12Atualize para macOS 13+

Como atualizar

1
2
3
4
5
6
# Baixe Go 1.26
go install golang.org/dl/go1.26@latest
go1.26 download

# Ou via site oficial
# https://go.dev/dl/

Depois de atualizar, rode o novo go fix para modernizar seu código:

1
go fix ./...

Conclusão

Go 1.26 é uma versão sólida. O Green Tea GC por padrão é a mudança mais impactante — você vai notar a diferença em aplicações que fazem uso intenso de memória.

As mudanças na linguagem são pequenas mas úteis. O go fix reescrito é uma aposta no longo prazo para manter bases de código Go modernas.

Vale atualizar. E como sempre, a promise de compatibilidade do Go 1 garante que seu código existente vai continuar funcionando.

Referências e fontes