3 pontos por lemonmint 2024-12-20 | 4 comentários | Compartilhar no WhatsApp

[IMG] Overview of Go 1.24

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

 
secret3056 2024-12-20

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 tag foi um erro.

 
gkswnsqja 2024-12-20

Eu também, pessoalmente, queria muito que houvesse macros. Até quando vamos ter que ficar usando generate? buá

 
qkrqjadn 2024-12-20

Tenho curiosidade em saber por que struct tag é considerado um erro.

 
secret3056 2024-12-20

A maior dificuldade é que fica muito complicado contar com a ajuda das ferramentas.

  • Por ser texto, mesmo que haja um erro de digitação, é difícil encontrar o problema.
  • Tirando JSON, não há autocompletar nem IntelliSense.
  • Ao usar várias ferramentas, é preciso colocar tudo em uma única linha, e é inevitável a sensação de que isso prejudica a legibilidade.

O gomodifytags já existe há bastante tempo, mas a integração com a extensão Go do VSC também demorou bastante.