- 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
Comentários do Hacker News
io.Copyagora pode usar a chamada de sistema Linuxsplice(2)ao copiar deTCPConnparaUnixConn. Foi destacada a utilidade desse tipo de padrão no pacoteio.httpmuxgo121.sql.Null[T]foi bem recebida. Antes, era usado onulldosqlboiler, que tem uma API semelhante à desql.Null, mas inclui adicionalmente o métodoIsSet() bool, que informa se um valor foi explicitamente definido.chi.any.