1 pontos por GN⁺ 2024-02-08 | 1 comentários | Compartilhar no WhatsApp
  • A versão Go 1.22 foi lançada 6 meses após o Go 1.21.
  • A maior parte das mudanças está na implementação da toolchain, do runtime e das bibliotecas.
  • Mantendo a promessa de compatibilidade do Go 1, espera-se que quase todos os programas em Go continuem compilando e executando como antes.

Mudanças na linguagem

  • Há duas mudanças no loop "for".
    • Antes, as variáveis declaradas por um loop "for" eram criadas uma vez e atualizadas a cada iteração, mas no Go 1.22 cada iteração do loop cria uma nova variável, evitando bugs de compartilhamento acidental.
    • Agora o loop "for" também pode iterar sobre inteiros com range.

Ferramentas

Comando Go

  • Agora é possível gerenciar dependências em um workspace usando o diretório vendor.
  • go get não é mais suportado no modo legado GOPATH, que não usa módulos.
  • go mod init agora não tenta mais importar requisitos de módulo a partir de arquivos de configuração de outras ferramentas de vendoring.
  • go test -cover agora imprime um resumo de cobertura para pacotes que não têm arquivos de teste próprios.

Trace

  • A interface web da ferramenta trace foi parcialmente redesenhada para oferecer suporte ao novo tracer.

Vet

  • O comportamento da ferramenta vet para variáveis de loop foi alterado.
  • Foi adicionado um novo aviso para chamadas de append que não adicionam valores.
  • Foi adicionado um novo aviso para problemas ao usar time.Since em instruções defer.
  • Foi adicionado um novo aviso quando pares chave-valor não correspondem em chamadas de log/slog.

Runtime

  • O metadata de coleta de lixo baseado em tipos agora fica mais próximo dos objetos no heap, melhorando o desempenho de CPU em 1-3%.

Compilador

  • Builds com otimização guiada por perfil (PGO) agora conseguem devirtualizar mais chamadas do que antes.

Linker

  • As flags -s e -w do linker foram alteradas para funcionar de forma mais consistente em todas as plataformas.

Bootstrap

  • O Go 1.22 exige, para bootstrap, a versão final de patch do Go 1.20 ou superior.

Biblioteca principal

Novo pacote math/rand/v2

  • math/rand/v2 é o primeiro pacote “v2” da biblioteca padrão e traz várias mudanças importantes em comparação com math/rand.

Novo pacote go/version

  • Foi adicionado o novo pacote go/version, que implementa funções para validar e comparar strings de versão do Go.

Padrões de roteamento aprimorados

  • O roteamento HTTP da biblioteca padrão foi melhorado para ficar mais expressivo.

Pequenas mudanças nas bibliotecas

  • Há pequenas mudanças e melhorias de desempenho em várias bibliotecas.

Ports

Darwin

  • No macOS, na arquitetura x86 de 64 bits (darwin/amd64 port), a toolchain do Go agora gera executáveis position-independent (PIE) por padrão.

Arm

  • É possível escolher ponto flutuante por software ou por hardware usando a variável de ambiente GOARM.

Loong64

  • O port loong64 agora passa argumentos e resultados de função usando registradores.

OpenBSD

  • Foi adicionado um port experimental para PowerPC 64 bits big-endian (openbsd/ppc64) no OpenBSD.

Opinião do GN⁺

  • Este lançamento do Go 1.22 se destaca especialmente pelas mudanças no loop "for" e pela introdução do novo pacote math/rand/v2. Essas mudanças oferecem melhor desempenho e estabilidade para desenvolvedores Go e refletem a evolução da linguagem.
  • O pacote math/rand/v2 oferece melhores recursos de geração de números aleatórios por meio de algoritmos mais rápidos e uma nova API, o que representa uma melhoria importante para criptografia e outras aplicações que dependem de aleatoriedade.
  • Espera-se que o Go 1.22 tenha um impacto positivo na comunidade Go ao oferecer várias otimizações e novos recursos que melhoram o desempenho e a experiência do desenvolvedor sem abrir mão da compatibilidade.

1 comentários

 
GN⁺ 2024-02-08
Comentários do Hacker News
  • Um desenvolvedor TypeScript compartilhou sua experiência recente de migração para a linguagem Go. No começo, ele demonstrou preocupação com a falta de funções para arrays e com o sistema de tipos pouco flexível do Go. Porém, ao usar Go, percebeu as vantagens da excelente biblioteca padrão, da segurança de tipos e dos padrões de codificação embutidos. Também avaliou positivamente a integração do roteamento à biblioteca padrão.
  • Foi compartilhado um link com notas de lançamento interativas da versão Go 1.22.
  • Um desenvolvedor que usa Go há mais de 9 anos comparou Dart (para desenvolvimento com Flutter) e Go. Enquanto Dart tenta adicionar todos os recursos possíveis, Go segue o caminho oposto e busca simplicidade. Em Dart, as várias formas de inicializar classes acabam gerando confusão, o que faz esse desenvolvedor sentir falta da simplicidade do Go. Expressões únicas complexas usando map/stream etc. no Dart podem causar confusão durante a depuração ou para desenvolvedores iniciantes.
  • io.Copy agora pode usar a chamada de sistema Linux splice(2) ao copiar de TCPConn para UnixConn. Foi destacada a utilidade desse tipo de padrão no pacote io.
  • Os padrões de roteamento foram aprimorados no Go 1.22, mas isso pode causar pequenos problemas de compatibilidade. Isso pode ser controlado pelo campo httpmuxgo121.
  • Um desenvolvedor não gostou do recurso de “escopo de função” adicionado à linguagem. Ele considera que esse recurso não oferece conveniência suficiente em relação à complexidade adicional introduzida e que não combina com o estilo explícito e simples do Go.
  • Foi compartilhado um link de discussão sobre o fato de cada iteração do laço criar uma nova variável no Go 1.22.
  • A adição de sql.Null[T] foi bem recebida. Antes, era usado o null do sqlboiler, que tem uma API semelhante à de sql.Null, mas inclui adicionalmente o método IsSet() bool, que informa se um valor foi explicitamente definido.
  • Foi bem recebida a adição de roteamento à biblioteca padrão, e há quem esteja considerando remover a biblioteca chi.
  • Entre desenvolvedores que usam Go em produção, surgiu a pergunta se eles migram rapidamente para versões novas ou preferem permanecer em releases antigas. Também houve troca de opiniões sobre o uso da palavra-chave any.