As melhorias mais importantes do Go 1.24
(gosuda.org)A versão Go 1.24 parece ser um lançamento importante, introduzindo várias melhorias com foco em desempenho, segurança e experiência do desenvolvedor. Essas mudanças têm como objetivo tornar o Go ainda mais poderoso e eficiente para a construção de aplicações modernas.
Melhorias de desempenho
Houve melhorias gerais de desempenho que reduziram a sobrecarga de CPU em 2% a 3% em um conjunto representativo de benchmarks. Essas melhorias incluem uma nova implementação embutida de map, alocação de memória mais eficiente para objetos pequenos e uma nova implementação interna de mutex no runtime. Os resultados podem variar dependendo da aplicação.
Criptografia resistente a ataques quânticos
Foi introduzido o pacote crypto/mlkem, que implementa ML-KEM-768 e ML-KEM-1024. O ML-KEM, anteriormente conhecido como Kyber, é um mecanismo de troca de chaves resistente a ataques quânticos especificado no FIPS 203. Essas adições preparam o Go para a segurança criptográfica do futuro.
Client Hello criptografado
Há suporte a ECH (Encrypted Client Hello) no TLS. Esse recurso pode ser ativado preenchendo o campo Config.EncryptedClientHelloKeys e reforça a privacidade e a segurança das conexões TLS.
Novo Swiss Table Map
Uma implementação aprimorada de map para melhor desempenho. Essa nova implementação é baseada em Swiss Tables e pode ser desativada com a flag de build GOEXPERIMENT=noswissmap.
Atualizações no Sync Map
O desempenho de modificação de map em sync.Map foi melhorado. Modificações em conjuntos de chaves separados têm muito menos chance de contenção em maps maiores, e o tempo de preparação antes necessário para alcançar baixa contenção no map não é mais exigido. Se surgirem problemas, é possível voltar à implementação anterior usando GOEXPERIMENT=nosynchashtriemap.
Marshalling de JSON aprimorado
Uma nova opção da tag omitempty permite omitir campos de struct de forma mais inteligente durante o marshalling de JSON. Ao fazer o marshalling, um campo de struct com a opção omitempty será omitido se seu valor for zero. Se o tipo do campo tiver um método IsZero() bool, esse método será usado para verificar se o valor é zero.
Limpeza no runtime
Foi introduzida a função AddCleanup, que substitui SetFinalizer para um gerenciamento de recursos melhor. Diferentemente de SetFinalizer, ela não ressuscita o objeto associado para finalização, e é possível associar várias limpezas a um único objeto. Em códigos novos, deve-se preferir AddCleanup em vez de SetFinalizer.
Diretiva de ferramentas no go.mod
O rastreamento de dependências de ferramentas foi melhorado com a diretiva de ferramentas no go.mod. Isso elimina a necessidade da solução alternativa anterior de adicionar ferramentas por meio de importações em branco em um arquivo com o nome convencional tools.go.
Acesso restrito a diretórios
Um novo tipo os.Root para operações controladas no sistema de arquivos. O tipo os.Root fornece a capacidade de executar operações no sistema de arquivos dentro de um diretório específico, impedindo o acesso fora do caminho designado.
Melhorias em testes
Um novo pacote testing/synctest para testar código concorrente. A função synctest.Run inicia um grupo de goroutines em uma “bolha” isolada, e a função synctest.Wait espera até que todas as goroutines da bolha atual estejam bloqueadas. Esse pacote é experimental e deve ser ativado definindo GOEXPERIMENT=synctest no momento do build.
Cache de build
Os executáveis de go run agora são armazenados em cache para execução mais rápida. Isso torna execuções repetidas mais rápidas, em troca de um cache maior.
Desempenho de Cgo
Novas anotações #cgo noescape e #cgo nocallback para melhor desempenho de Cgo. #cgo noescape cFunctionName informa ao compilador que a memória passada para a função C não escapa. #cgo nocallback cFunctionName informa ao compilador que a função C não chamará uma função Go de volta.
Ponteiros fracos
Suporte a ponteiros fracos para referenciar memória com segurança sem impedir a coleta. Ponteiros fracos são um bloco de construção de baixo nível fornecido para permitir a criação de estruturas eficientes em memória, como weak maps para associação de valores, maps de canonicalização e vários tipos de cache.
Melhorias em testes de benchmark
Um novo método testing.B.Loop para benchmarks mais rápidos e com menos erros. A função de benchmark é executada exatamente uma vez por -count, então etapas caras de configuração e limpeza são executadas apenas uma vez. Os parâmetros e resultados da chamada de função são preservados, impedindo que o compilador otimize completamente o corpo do loop.
A versão Go 1.24 parece ser um lançamento importante, trazendo melhorias significativas em vários aspectos da linguagem e de seu ecossistema.
4 comentários
Quem usa Go, tem alguma funcionalidade que gostaria de ver na linguagem?
Eu gostaria de operadores como
.?e??, e, se possível, macros.Sinceramente,
struct tagfoi um erro.Eu também, pessoalmente, queria muito que houvesse macros. Até quando vamos ter que ficar usando
generate? buáTenho curiosidade em saber por que
struct tagé considerado um erro.A maior dificuldade é que fica muito complicado contar com a ajuda das ferramentas.
O
gomodifytagsjá existe há bastante tempo, mas a integração com a extensão Go do VSC também demorou bastante.