Versão 1.22

A linguagem de programação Go, versão 1.22, está sendo lançada. O Google, com a contribuição da comunidade, está desenvolvendo uma solução híbrida que combina o alto desempenho de linguagens compiladas com as vantagens de linguagens de script, como facilidade de escrita, desenvolvimento rápido e proteção contra erros. O código do projeto é distribuído sob a licença BSD.

A sintaxe do Go é baseada em elementos familiares da linguagem C, com algumas adaptações do Oberon. A linguagem é relativamente concisa, porém fácil de ler e entender. O código Go é compilado em executáveis ​​binários independentes que rodam nativamente, sem a necessidade de uma máquina virtual (os subsistemas de criação de perfil, depuração e outros recursos de detecção de problemas em tempo de execução são integrados como componentes de tempo de execução), alcançando desempenho comparável ao de programas em C.

O projeto foi concebido desde o início com programação multithread e operação eficiente em sistemas multi-core em mente, incluindo ferramentas de nível de operador para organizar computações paralelas e interações entre métodos executados simultaneamente. A linguagem também oferece proteção integrada contra estouros de memória e suporta coleta de lixo.

Entre as mudanças no novo lançamento:

  • Foi adicionado suporte para definir intervalos de números inteiros aos loops "for". Por exemplo, para percorrer os valores de 0 a 9, agora você pode usar o loop "for i := range 10 {...}".
  • Foi adicionado suporte experimental para funções de intervalo aos loops "for" (GOEXPERIMENT=rangefunc), permitindo que você especifique uma função como iterador. Por exemplo, "for i, x := range slices.Backward(s) {…}"
  • Um problema antigo com loops `for` que fazia com que as chamadas de goroutines compartilhassem variáveis ​​de loop entre iterações foi resolvido. Por exemplo, o código `values ​​​​:= []string{"a", "b", "c"} for _, v := range values ​​​​{ go func() { fmt.Println(v) done <- true }() }` agora imprimirá "a", "b" e "c", em vez de apenas "c", como antes.
  • Foram realizadas otimizações no gerenciamento de memória em tempo de execução, resultando em um aumento de desempenho de 1 a 3% e uma redução de 1% no consumo de memória na maioria das aplicações.
  • O trabalho prosseguiu na implementação de otimizações guiadas por perfil (PGO) no compilador, levando em consideração os recursos de tempo de execução. A nova versão do compilador utiliza ferramentas de desvirtualização para substituir chamadas de método indiretas por execução inline expandida.
  • Com o PGO ativado, a alteração implementada melhorou o desempenho da maioria dos programas em 2 a 14%.
  • Uma implementação experimental (GOEXPERIMENT=newinliner) aprimorada do mecanismo de inlining de chamadas foi adicionada ao compilador, usando heurísticas para separar operações importantes de operações não importantes.
  • O pacote "math/rand/v2" foi adicionado à biblioteca padrão, fornecendo uma API mais abrangente e algoritmos de geração de números pseudoaleatórios mais rápidos.
  • O pacote net/http.ServeMux agora suporta a especificação de métodos e máscaras em modelos. Por exemplo, o modelo "GET /static/{id}/" será aplicado a requisições com o método HTTP "GET" e armazenará o valor do segundo segmento do caminho solicitado no identificador "id".
  • O pacote database/sql agora suporta o tipo Null[T], permitindo a leitura de colunas que podem ser nulas. O pacote slices agora possui uma função Concat para mesclar múltiplas fatias de qualquer tipo.
  • Os comandos para trabalhar com espaços de trabalho (conjuntos de módulos) agora suportam o uso de um diretório "vendor", que contém as dependências do conteúdo do espaço de trabalho. Este diretório é criado ao executar o comando "go work vendor" e é usado nos comandos de compilação quando a opção "-mod=vendor" é especificada (habilitada por padrão se o diretório vendor existir).

Alterações no comportamento de consumo de energia.

  • O comando `go get` não é mais suportado fora de um módulo no modo GOPATH legado (ou seja, com `GO111MODULE=off`). Outros comandos de compilação, como `go build` e `go test`, continuarão funcionando indefinidamente para programas GOPATH legados.
  • O comando `go mod init` não tenta mais importar requisitos de módulos de arquivos de configuração de outras ferramentas de terceiros (como o Gopkg.lock).
  • O comando `go test -cover` agora exibe dados de resumo de cobertura para pacotes cobertos que não possuem seus próprios arquivos de teste. Antes do Go 1.22, o comando `go test -cover` exibia dados de resumo de cobertura para um pacote como este: `mymod/mypack [sem arquivos de teste]`.

    E agora, a partir do Go 1.22, as funções em um pacote são consideradas não cobertas: cobertura de mymod/mypack: 0.0% das instruções. Observação: se um pacote não contiver nenhum código executável, não podemos relatar uma porcentagem de cobertura significativa; para esses pacotes, o comando `go test` continuará relatando arquivos de teste ausentes.

  • A interface web da ferramenta de rastreamento foi ligeiramente atualizada como parte do suporte ao novo rastreador. Vários problemas foram resolvidos e a legibilidade de diversas páginas foi aprimorada. A interface web agora suporta a inspeção de rastreamentos em uma visualização thread-safe. O visualizador de rastreamentos agora também exibe a duração completa de todas as chamadas de sistema. Essas melhorias se aplicam apenas a rastreamentos gerados por programas compilados com Go 1.22 ou posterior. Em uma versão futura, algumas dessas melhorias serão implementadas também para rastreamentos gerados por versões mais antigas do Go.
  • O ambiente de execução agora armazena metadados de coleta de lixo baseados em tipo mais próximos de cada objeto na heap. Essa alteração também reduz a pegada de memória da maioria dos programas Go em aproximadamente 1%, eliminando metadados redundantes. A melhoria pode ser menor em alguns programas, pois essa alteração ajusta os limites das classes de tamanho do alocador de memória, de modo que alguns objetos podem ser movidos para uma classe de tamanho maior. Uma consequência dessa alteração é que os endereços de alguns objetos que antes eram sempre alinhados em limites de 16 bytes (ou maiores) agora serão alinhados apenas em limites de 8 bytes. Alguns programas que usam instruções de assembly que exigem que os endereços de memória sejam alinhados em tamanhos maiores que 8 bytes e dependem do comportamento de alinhamento anterior do alocador de memória podem falhar, mas esperamos que esses programas sejam raros. Tais programas podem ser compilados com GOEXPERIMENT=noallocheaders com a opção de reverter para o modelo de metadados antigo e restaurar o comportamento de alinhamento anterior, mas os proprietários dos pacotes devem atualizar seu código assembly para evitar a suposição de alinhamento, pois essa solução alternativa será removida em uma versão futura.
  • Conforme mencionado nas notas de lançamento do Go 1.20, o Go 1.22 agora requer a versão final do Go 1.20 ou posterior para a compilação inicial. Esperamos que o Go 1.24 também exija a versão final do Go 1.22 ou posterior para a compilação inicial.
    Original (go.dev)

Fonte: linux.org.ru

Compre hospedagem confiável para sites com proteção DDoS, servidores VPS VDS 🔥 Compre hospedagem de sites confiável com proteção contra DDoS, servidores VPS/VDS | ProHoster