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.
4 comentários
Parece que foi feito como uma imagem por meio de LLM, mas ficou bonito de ver.
Talvez, do que isso se trata?
Na primeira linha do texto, há um link de imagem bem organizado e fácil de visualizar de relance.
encoding/jsonv1 e v2 no Go 1.25: https://gosuda.org/ko/blog/…