Lançamento do Go 1.25
(go.dev)A versão Go 1.25 foi oficialmente lançada. Esta versão inclui melhorias em ferramentas, runtime, compilador e biblioteca padrão como um todo, além de apresentar funcionalidades experimentais importantes que os usuários podem testar antecipadamente e sobre as quais podem enviar feedback.
- Principais destaques:
- Manutenção da compatibilidade com a versão Go 1
- Melhorias abrangentes em ferramentas, runtime, compilador e bibliotecas
- Introdução de novas funcionalidades experimentais (GreenTea GC, pacote json/v2)
Funcionalidades experimentais principais
O Go 1.25 inclui duas funcionalidades experimentais principais voltadas para melhorar desempenho e recursos, que podem ser ativadas pelos usuários por meio da configuração de variáveis de ambiente.
Novo coletor de lixo GreenTea (GC)
O objetivo é melhorar o desempenho reduzindo a sobrecarga do GC ao lidar com grande quantidade de objetos pequenos.
- Como funciona: objetos pequenos com menos de 512 bytes são agrupados em unidades de 8KiB chamadas "memory spans" para execução do GC. Isso aumenta a localidade de memória (
locality) e maximiza a eficiência do cache da CPU. - Efeitos esperados:
- Melhoria no desempenho do GC com redução do custo de saltos de memória
- Funcionamento eficiente em ambientes multicore
- Redução da sobrecarga de alocação de objetos pequenos e da fragmentação de memória
- Como ativar: definir a variável de ambiente
GOEXPERIMENT=greenteagcdurante o build
Novo pacote encoding/json/v2
Trata-se de uma nova implementação de JSON projetada para resolver a falta de consistência, o comportamento imprevisível e os problemas de desempenho do encoding/json (v1) existente.
-
Objetivos principais:
- Mais exatidão e previsibilidade: por padrão, aplica regras mais rígidas (por exemplo, diferenciação entre maiúsculas e minúsculas e proibição de chaves duplicadas), reduzindo comportamentos inesperados.
- Melhoria de desempenho: o mecanismo de parsing e encoding foi reprojetado para aumentar a eficiência.
- Mais flexibilidade e controle: foi introduzido um sistema refinado de opções para que desenvolvedores possam controlar detalhadamente o processamento de JSON.
-
Principais mudanças (v2 em relação à v1):
- Correspondência de nomes de campos: ao contrário da abordagem sem diferenciação entre maiúsculas e minúsculas da v1, a v2 por padrão diferencia maiúsculas de minúsculas com precisão.
- Mudança no significado da tag
omitempty: enquanto a v1 omitía com base no "estado vazio" do valor Go (0, false, nil etc.), a v2 omite com base no "estado vazio" do valor JSON codificado (null,"",{},[]). - Tratamento de slices e maps
nil: a v1 fazia marshal comonull, mas a v2 por padrão faz marshal como[](array vazio) e{}(objeto vazio), respectivamente. - Unmarshal de arrays: a v1 permitia que o tamanho do array JSON e do array Go fosse diferente, mas a v2 exige que os tamanhos correspondam exatamente, caso contrário retorna erro.
- Tratamento de chaves duplicadas: a v1 permitia chaves duplicadas (sobrescrevendo com o último valor), mas a v2 por padrão retorna erro, reforçando exatidão e segurança.
- Tratamento de UTF-8 inválido: a v1 substituía automaticamente caracteres UTF-8 inválidos por
\uFFFD, mas a v2 por padrão retorna erro, evitando corrupção de dados.
-
Novos recursos e estrutura:
- Estrutura modular: a análise sintática de baixo nível (pacote
jsontext) e a conversão semântica de alto nível (pacotejson/v2) foram separadas para melhorar a clareza do código e o desempenho. - Sistema robusto de opções: por meio de
json.Options, é possível controlar detalhadamente diversos comportamentos e até reproduzir completamente o comportamento da v1. - Tratamento de tipos externos: com as opções
WithMarshalerseWithUnmarshalers, é possível injetar lógica de serialização/desserialização para tipos de pacotes externos que não implementam as interfacesMarshaler/Unmarshaler.
- Estrutura modular: a análise sintática de baixo nível (pacote
-
Como ativar: definir a variável de ambiente
GOEXPERIMENT=jsonv2durante o build
Principais mudanças e melhorias
Este lançamento traz várias melhorias voltadas a aumentar a produtividade no desenvolvimento e a eficiência da execução de programas.
-
Runtime
- GOMAXPROCS com reconhecimento de ambiente de contêiner: em Linux, reconhece automaticamente os limites de CPU do cgroup para definir o valor padrão de
GOMAXPROCSe atualiza isso dinamicamente quando os recursos de CPU mudam. - Trace Flight Recorder: oferece um recurso leve de rastreamento que grava continuamente traces do runtime em um buffer circular na memória para depurar bugs raros.
- GOMAXPROCS com reconhecimento de ambiente de contêiner: em Linux, reconhece automaticamente os limites de CPU do cgroup para definir o valor padrão de
-
Ferramentas e compilador
- Correção de bug de ponteiro nil: foi corrigido um bug do compilador presente desde o Go 1.21 que adiava verificações de ponteiro nil, fazendo com que códigos que anormalmente tinham sucesso agora provoquem panic corretamente.
- Suporte a DWARF5: usa a versão 5 do DWARF para informações de depuração, reduzindo o tamanho dos binários e o tempo de linkedição.
- Nova diretiva
go.mod ignore: permite configurar o comandogopara ignorar diretórios específicos.
-
Biblioteca padrão
- Adição do pacote
testing/synctest: novo pacote para dar suporte a testes de código concorrente, permitindo execução isolada de testes em tempo virtualizado. - Melhoria de desempenho no pacote
crypto: no modo FIPS, a velocidade de assinatura deecdsaeed25519ficou 4 vezes maior, e a velocidade de hashing SHA também foi melhorada. - Adição de
net/httpCrossOriginProtection: oferece um novo recurso para defesa contra ataques CSRF usando metadados Fetch de navegadores modernos.
- Adição do pacote
Mudanças de portas e suporte
- macOS: a partir do Go 1.25, é necessário macOS 12 Monterey ou superior.
- Windows: a porta 32 bits
windows/armdeixará de ser suportada após esta versão.
Ainda não há comentários.