Go 1.24

Go 1.24

A nova versão do Go, 1.24, é lançada seis meses após Go 1.23. A maioria das mudanças está na implementação da cadeia de ferramentas, do runtime e das bibliotecas. Como sempre, o lançamento garante a promessa de compatibilidade do Go 1. Os desenvolvedores da linguagem esperam que quase todos os programas em Go continuem a compilar e funcionar como antes.

Mudanças na linguagem

O Go 1.24 agora suporta completamente aliases de tipos genéricos: o alias de tipo pode ser parametrizado como um tipo declarado. Mais detalhes na especificação da linguagem. Por enquanto, essa funcionalidade pode ser desativada configurando GOEXPERIMENT=noaliastypeparams; no entanto, a opção aliastypeparams será removida no Go 1.25.

Ferramentas

O comando go

Módulos do Go agora podem rastrear dependências executáveis usando a diretiva tool em go.mod. Isso elimina a necessidade da solução anterior de adicionar ferramentas como imports vazios no arquivo, geralmente chamado de “tools.go”. O comando go tool agora pode executar essas ferramentas além das ferramentas fornecidas com o Go. Mais informações podem ser vistas em documentação.

A nova flag -tool para go get leva à adição da diretiva de ferramenta no módulo atual para os pacotes especificados, além de adicionar diretivas de requisitos.

Novo meta-padrão tool se refere a todas as ferramentas no módulo atual. Isso pode ser usado para atualizar todas elas através do go get tool ou para instalá-las no seu diretório GOBIN através do go install tool.

Os arquivos executáveis criados através do go run e o novo comportamento do go tool agora são armazenados em cache no cache de construção do Go. Isso torna as execuções repetidas mais rápidas devido ao cache aumentado. #69290.

Os comandos go build e go install agora aceitam a flag -json, que informa a saída e os erros da construção como uma saída estruturada em JSON na saída padrão. Os detalhes do formato podem ser vistos em go help buildjson.

Além disso, go test -json agora reporta a saída e os erros da construção em JSON, misturados com o JSON do resultado do teste. Eles podem ser diferenciados por novos tipos de Ação, mas se isso causar problemas no sistema de integração de testes, pode-se reverter para a saída de texto da construção através da configuração GODEBUG gotestjsonbuildtext=1.

A nova variável de ambiente GOAUTH fornece uma maneira flexível de autenticar pulls privados de módulos. Os detalhes podem ser vistos em go help goauth.

O comando go build agora instala a versão do módulo principal no binário compilado, com base na tag e/ou commit do sistema de controle de versão. O sufixo +dirty será adicionado na presença de alterações não commitadas. É possível usar a flag -buildvcs=false para omitir informações de controle de versão do binário.

Novo configuração de GODEBUG toolchaintrace=1 agora pode ser usada para rastrear o processo de seleção da toolchain na equipe go.

Cgo

Cgo suporta novas anotações para funções C para melhorar o desempenho em tempo de execução. #cgo noescape cFunctionName informa ao compilador que a memória passada para a função C cFunctionName não escapa. #cgo nocallback cFunctionName informa ao compilador que a função C cFunctionName não chama nenhuma função Go. Mais informações podem ser vistas na documentação do cgo.

Cgo atualmente se recusa a compilar chamadas para funções C que possuem declarações incompatíveis. Por exemplo, se f for declarado tanto como void f(int) quanto como void f(double), cgo gerará um erro em vez de possivelmente gerar uma sequência de chamadas incorreta f(0). O novo neste lançamento é uma detecção aprimorada dessa condição de erro quando declarações incompatíveis aparecem em arquivos diferentes. #67699.

Objdump

A ferramenta objdump agora suporta desassemblagem em LoongArch de 64 bits (GOARCH=loong64), RISC-V (GOARCH=riscv64) e S390X (GOARCH=s390x).

Vet

Um novo analisador de testes informa erros comuns em declarações de testes, fuzzers, benchmarks e exemplos em pacotes de teste, como nomes malformados, assinaturas incorretas ou exemplos que documentam identificadores inexistentes. Alguns desses erros podem levar à falha dos testes.

O analisador printf existente agora relata diagnósticos para chamadas da forma fmt.Printf(s), onde s é uma string de formato não constante, sem outros argumentos. Essas chamadas quase sempre são um erro, pois o valor de s pode conter o símbolo %; em vez disso, use fmt.Print. 60529. Essa verificação tende a fazer descobertas em código existente, e, portanto, é aplicada apenas quando a versão da linguagem (conforme especificado pela diretiva go no arquivo go.mod ou nos comentários `//go:build`) é pelo menos Go 1.24, para evitar que ocorram falhas de integração contínua ao atualizar para a toolchain Go 1.24.

O analisador buildtag existente agora reporta diagnósticos quando há uma restrição de versão de build incorreta. versão superior da build Go na diretiva //go:build. Por exemplo, //go:build go1.23.1 refere-se a uma versão pontual; em vez disso, use //go:build go1.23. #64127.

O analisador copylock existente agora reporta diagnósticos quando uma variável declarada em um loop 'for' triplo, como for i := iter(); done(i); i = next(i) { … }, contém sync.Locker, como sync.Mutex. Go 1.22 mudou o comportamento desses loops para criar uma nova variável em cada iteração, copiando os valores da iteração anterior; essa cópia não é segura para locks. #66387.

GOCACHEPROG

O binário interno cmd/go e o mecanismo de cache de testes agora podem ser implementados por processos filhos que implementam o protocolo JSON entre a ferramenta cmd/go e o processo filho, nomeado pela variável de ambiente GOCACHEPROG. Antes, isso estava sob GOEXPERIMENT. Os detalhes do protocolo podem ser vistos em documentação.

Tempo de Execução

Várias melhorias de desempenho no runtime reduziram a sobrecarga da CPU em média de 2 a 3% entre um conjunto representativo de benchmarks. Os resultados podem variar de acordo com o aplicativo. Essas melhorias incluem uma nova implementação interna de mapa baseada em Tabelas Suecas, alocação de memória mais eficiente para pequenos objetos e uma nova implementação interna de mutex no runtime.

A nova implementação interna de mapa e o novo mutex do runtime podem ser desativados com as configurações GOEXPERIMENT=noswissmap e GOEXPERIMENT=nospinbitmutex durante a build, respectivamente.

Compilador

O compilador já proibia a definição de novos métodos com tipos de receptor gerados pelo cgo, mas era possível contornar essa restrição por meio de alias de tipo. O Go 1.24 agora sempre reporta um erro se o receptor designa um tipo gerado pelo cgo, direta ou indiretamente (através de um tipo alias).

Linker

O linker agora gera um identificador de build GNU (registro ELF NT_GNU_BUILD_ID) em plataformas ELF e UUID (comando de carregamento Mach-O LC_UUID) no macOS por padrão. O identificador de build ou UUID é derivado do identificador de build do Go. Isso pode ser desativado com a flag do linker -B none, ou redefinido com a flag do linker -B 0xNNNN com um valor hexadecimal especificado pelo usuário.

Promoção

Como indicado em notas da versão do Go 1.22, Go 1.24 agora requer Go 1.22.6 ou posterior para ser executado. Os desenvolvedores esperam que Go 1.26 exija um ponto de lançamento Go 1.24 ou posterior para sua execução.

Biblioteca padrão

Acesso limitado ao sistema de arquivos por diretório

Novo tipo os.Root oferece a capacidade de realizar operações de sistema de arquivos dentro de um diretório específico.

Função os.OpenRoot abre um diretório e retorna os.Root. Os métodos em os.Root operam dentro deste diretório e não permitem que os caminhos façam referência a locais fora do diretório, incluindo aqueles que seguem links simbólicos para fora do diretório. Os métodos em os.Root refletem a maioria das operações de sistema de arquivos disponíveis no pacote os, incluindo, por exemplo, os.Root.Open, os.Root.Create, os.Root.Mkdir e os.Root.Stat.

Nova função de benchmark

Os benchmarks agora podem usar um método mais rápido e menos propenso a erros testing.B.Loop para realizar iterações de benchmark como for b.Loop() { … } em vez de estruturas de loop típicas envolvendo b.N como for range b.N. Isso oferece duas vantagens significativas:

  • A função de benchmark é executada exatamente uma vez para cada -count, assim, etapas de configuração e limpeza dispendiosas são executadas apenas uma vez.
  • Os parâmetros da função e os resultados continuam a existir, impedindo que o compilador otimize completamente o corpo do loop.

Finalizadores aprimorados

Nova função runtime.AddCleanup é um mecanismo de finalização que é mais flexível, mais eficiente e menos propenso a erros do que runtime.SetFinalizer. AddCleanup anexa uma função de limpeza a um objeto, que será chamada assim que o objeto se tornar inacessível. No entanto, ao contrário do SetFinalizer, várias limpezas podem ser anexadas a um único objeto, limpezas podem ser anexadas a ponteiros internos, limpezas geralmente não causam vazamentos quando os objetos formam ciclos, e limpezas não atrasam a liberação do objeto ou objetos que ele aponta. O novo código deve preferir AddCleanup em vez de SetFinalizer.

Novo pacote weak

Novo pacote weak fornece ponteiros fracos.

Ponteiros fracos são um primitivo de baixo nível, fornecido para criar estruturas que utilizam memória de forma eficiente, como dicionários fracos para mapeamento de valores, dicionários de canonização para qualquer coisa que não seja coberta pelo pacote unique, e diferentes tipos de caches. Para suportar esses casos de uso, este lançamento também fornece runtime.AddCleanup e maphash.Comparável.

Novo pacote crypto/mlkem

Novo pacote crypto/mlkem implementa ML-KEM-768 e ML-KEM-1024.

ML-KEM é um mecanismo de troca de chaves pós-quântico, anteriormente conhecido como Kyber e especificado em FIPS 203.

Novos pacotes crypto/hkdf, crypto/pbkdf2 e crypto/sha3

Novo pacote crypto/hkdf implementa a função de saída de chave baseada em HMAC “Extract-and-Expand” HKDF, conforme definido em RFC 5869.

Novo pacote crypto/pbkdf2 implementa a função de saída de chave baseada em senha PBKDF2, conforme definido em RFC 8018.

Novo pacote crypto/sha3 implementa a função hash SHA-3 e as funções SHAKE e cSHAKE de saída extensível, conforme definido em FIPS 202.

Todos os três pacotes são baseados em pacotes existentes previamente em golang.org/x/crypto/…

Conformidade FIPS 140-3

Este lançamento inclui um novo conjunto de mecanismos para garantir a conformidade FIPS 140-3.

O módulo criptográfico Go é um conjunto de pacotes internos da biblioteca padrão que são usados de forma transparente para implementar algoritmos aprovados pela FIPS 140-3. Os aplicativos não requerem mudanças para usar o módulo criptográfico Go para algoritmos aprovados.

A nova variável de ambiente GOFIPS140 pode ser usada para selecionar a versão do módulo criptográfico Go a ser usada na construção. O novo configuração de GODEBUG fips140 pode ser usado para ativar o modo FIPS 140-3 durante a execução.

Go 1.24 inclui a versão v1.0.0 do módulo criptográfico Go, que atualmente está sendo testada com um laboratório credenciado pelo CMVP.

Novo pacote experimental testing/synctest

Novo pacote experimental testing/synctest fornece suporte para testar código concorrente.

  • Função synctest.Run executa um grupo de goroutines em um ‘bolha’ isolada. Na bolha, as funções do pacote time operam em relógios fictícios.
  • Funções synctest.Wait aguardam até que todas as goroutines estejam bloqueadas na bolha atual.

Detalhes podem ser vistos na documentação do pacote.

O pacote synctest é experimental e deve ser ativado definindo GOEXPERIMENT=synctest. A API do pacote pode mudar em lançamentos futuros. Em #67434 pode-se ver mais detalhes e fornecer feedback.

Mudanças menores na biblioteca

archive

As implementações (*Writer.AddFS) em archive/zip e archive/tar agora escrevem o cabeçalho do diretório para diretórios vazios.

bytes

Pacote bytes adiciona várias funções que trabalham com iteradores:

  • Lines retorna um iterador sobre linhas separadas por nova linha em uma fatia de bytes.
  • SplitSeq retorna um iterador sobre todos os subslices de uma fatia de bytes, separada pelo delimitador.
  • SplitAfterSeq retorna um iterador sobre subslices de uma fatia de bytes, separada após cada ocorrência do delimitador.
  • FieldsSeq retorna um iterador sobre subslices de uma fatia de bytes ao redor de sequências de caracteres de espaço, conforme definido por unicode.IsSpace
  • FieldsFuncSeq retorna um iterador sobre subslices de uma fatia de bytes ao redor de sequências de pontos de código Unicode que satisfazem o predicado.

crypto/aes

O valor retornado NewChipher não implementa mais os métodos NewCTR, NewGCM, NewCBCEncrypter e NewCBCDecrypter. Esses métodos foram não documentados e não estavam disponíveis em todas as arquiteturas. Agora o valor Block deve ser passado diretamente para as funções correspondentes crypto/cipher. Até o momento, crypto/cipher ainda verifica esses métodos em valores Block, mesmo que não sejam mais suportados pela biblioteca padrão.

crypto/cipher

Nova função NewGCMWithRandomNonce fundos! E ainda recebe elogios de 75-90% dos participantes, embora o desenvolvimento do projeto claramente tenha desacelerado. O mais surpreendente é que todos foram AEAD, que implementa AES-GCM, gerando um número único aleatório durante a operação Seal e adicionando-o ao início do texto cifrado.

Implementação Stream, retornada NewCTR quando usada com crypto/aes agora é várias vezes mais rápida em amd64 e arm64.

NewOFB, NewCFBEncrypter e NewCFBDecrypter agora estão marcados como obsoletos. Os modos OFB e CFB não são autenticados, o que geralmente permite ataques ativos para manipular e recuperar texto claro. Recomenda-se que as aplicações usem AEAD em vez disso. Se o modo não autenticado Stream for necessário, pode-se usar NewCTR em vez disso.

crypto/ecdsa

PrivateKey.Sign agora cria uma assinatura determinística de acordo com RFC 6979, se a fonte de aleatoriedade for nil.

crypto/md5

O valor retornado md5.New, agora também implementa a interface encoding.BinaryAppender.

crypto/rand

Função Read agora garante a ausência de falhas. Se Read encontrar um erro durante a leitura Reader, o programa terminará de forma irreversível. Observe que o Reader padrão está documentado para sempre funcionar com sucesso, portanto, essa mudança deve afetar apenas aqueles programas que substituem a variável Reader. Uma exceção são os núcleos do Linux anteriores à versão 3.17, onde o Reader padrão ainda abre /dev/urandom e pode falhar.

No Linux 6.11 e versões posteriores, o Reader agora utiliza a chamada de sistema getrandom através do vDSO. Isso é várias vezes mais rápido, geralmente para leituras pequenas.

No OpenBSD, o Reader agora utiliza arc4random_buf(3).

Nova função Texto agora pode gerar cadeias de texto aleatórias criptograficamente seguras.

crypto/rsa

GenerateKey agora retorna um erro se uma chave com menos de 1024 bits for solicitada. Todos os métodos Sign, Verify, Encrypt e Decrypt agora retornam um erro se usados com uma chave de tamanho inferior a 1024 bits. Essas chaves não são seguras e não devem ser utilizadas. Configuração GODEBUG rsa1024min=0 restaura o comportamento anterior, mas os desenvolvedores do Go recomendam fazer isso apenas quando necessário e somente em testes, por exemplo, adicionando a linha //go:debug rsa1024min=0 no arquivo de teste. O novo exemplo GenerateKey fornece uma chave de teste padrão de 2024 bits fácil de utilizar.

Agora é seguro e mais eficiente chamar PrivateKey.Precompute até PrivateKey.Validate. Precompute agora é mais rápido na presença de valores parcialmente preenchidos PrecomputedValues, por exemplo, ao extrair a chave de um JSON.

O pacote agora rejeita mais chaves inválidas, mesmo quando Validate não é chamado, e GenerateKey agora pode retornar novos erros para fontes de aleatoriedade quebradas. Os campos Primes e Precomputed da estrutura PrivateKey agora são utilizados e validados mesmo quando alguns valores estão ausentes. Também foram feitas alterações no crypto/x509 para a análise e extração de chaves RSA, descritas abaixo.

SignPKCS1v15 e VerifyPKCS1v15 agora suportam SHA-512/224, SHA-512/256 e SHA-3.

GenerateKey agora utiliza um método ligeiramente diferente para gerar o expoente privado (função de Carmichael em vez da função de Euler). Aplicações raras que recriam chaves somente a partir de números primos podem criar resultados diferentes, mas compatíveis.

Operações com chaves públicas e privadas agora são até duas vezes mais rápidas no wasm.

crypto/sha*

crypto/subtle

Nova função WithDataIndependentTiming permite ao usuário executar funções com características específicas da arquitetura, que garantem a invariância de certas instruções em relação ao tempo de valor dos dados. Isso pode ser usado para garantir que o código, projetado para operar em tempo constante, não foi otimizado por funções de nível de processador de forma que opere em tempo variável. Atualmente, o WithDataIndependentTiming utiliza o bit PSTATE.DIT no arm64 e não faz nada em todas as outras arquiteturas. Configuração GODEBUG dataindependenttiming=1 ativa o modo DIT para todo o programa Go.

Saída XORBytes deve se sobrepor completamente ou não com a entrada. O comportamento anterior era indefinido em caso contrário, enquanto agora o XORBytes irá panicar.

crypto/tls

O servidor TLS agora suporta Encrypted Client Hello (ECH). Esta funcionalidade pode ser ativada preenchendo o campo Config.EncryptedClientHelloKeys.

Um novo mecanismo de troca de chave pós-quântico X25519MLKEM768 agora é suportado e ativado por padrão quando Config.CurvePreferences é nil. Configuração GODEBUG tlsmlkem=0 retorna o padrão.

O suporte à troca de chave experimental X25519Kyber768Draft00 foi removido.

A ordem de troca de chave agora é totalmente processada pelo pacote crypto/tls. A ordem Config.CurvePreferences agora é ignorada, e o conteúdo é usado apenas para determinar quais trocas de chave incluir quando o campo é preenchido.

Novo campo ClientHelloInfo.Extensions enumera a lista de identificadores de extensões recebidos na mensagem Client Hello. Isso pode ser útil para fingerprinting de clientes TLS.

crypto/x509

Configuração GODEBUG x509sha1 foi removido. Certficicate.Verify não suporta mais assinaturas baseadas em SHA-1.

OID agora implementa as interfaces encoding.BinaryAppender e encoding.TextAppender.

O campo padrão de políticas de certificado foi alterado de Certificate.PolicyIdentifiers para Certificate.Policies. Quando analisando certificados, ambos os campos serão preenchidos, mas ao criar políticas de certificados, os valores serão extraídos do campo Certificate.Policies em vez de Certificate.PolicyIdentifiers. Essa mudança pode ser revertida com a configuração GODEBUG x509usepolicies=0.

CreateCertificate agora irá gerar um número de série utilizando um método compatível com a RFC 5280 ao passar o modelo pelo campo Certificate.SerialNumber nil, em vez de falhar.

Certificate.Verify agora suporta validação de políticas, conforme definido na RFC 5280 e RFC 9618. O novo campo VerifyOptions.CertificatePolicies pode ser definido em um conjunto aceitável de políticas OIDs. Somente cadeias de certificados com gráficos de políticas válidos serão retornadas de Certificate.Verify.

MarshalPKCS8PrivateKey agora retorna um erro em vez de extrair uma chave RSA inválida. (MarshalPKCS1PrivateKey não possui retorno de erro e seu comportamento com chaves incorretas fornecidas continua indefinido.)

ParsePKCS1PrivateKey e ParsePKCS8PrivateKey agora utilizam e validam os valores codificados CRT, portanto podem rejeitar chaves RSA inválidas que anteriormente eram aceitas. O uso de configuração GODEBUG x509rsacrt=0 reverte para o recálculo dos valores CRT.

debug/elf

Pacote debug/elf adiciona suporte para processamento de versões de símbolos em arquivos ELF (Executable and Linkable Format). O novo método File.DynamicVersions retorna uma lista de versões dinâmicas definidas no arquivo ELF. O novo método File.DynamicVersionNeeds retorna uma lista de versões dinâmicas exigidas por este arquivo ELF, que estão definidas em outros objetos ELF. Finalmente, novos campos Symbol.HasVersion e Symbol.VersionIndex indicam a versão do símbolo.

encoding

Dois novos interfaces TextAppender e BinaryAppender foram introduzidos para adicionar a representação textual ou binária de um objeto a um slice de bytes. Essas interfaces oferecem a mesma funcionalidade que TextMarshaler e BinaryMarshaler, mas em vez de alocar um novo slice a cada vez, elas adicionam dados diretamente ao slice existente. Essas interfaces agora são implementadas pelos tipos da biblioteca padrão que já implementam TextMarshaler e/ou BinaryMarshaler.

encoding/json

Ao serializar, um campo de estrutura com a nova opção omitzero no marcador de campo será omitido se seu valor for zero. Se o tipo do campo tiver um método IsZero() bool, ele será usado para determinar se o valor é zero. Caso contrário, o valor será zero se for um valor nulo para seu tipo. O marcador de campo omitzero é mais limpo e menos suscetível a erros do que omitempty, quando a intenção é omitir valores nulos. Em particular, ao contrário de omitempty, omitzero omite valores nulos time.Time , o que é uma origem comum de problemas.

Se ambos omitempty e omitzero forem especificados, o campo será omitido se o valor estiver vazio ou nulo (ou ambos ao mesmo tempo).

UnmarshalTypeError.Field agora inclui estruturas embutidas para fornecer mensagens de erro mais detalhadas.

go/types

Todas as estruturas de dados go/types que revelam sequências de pares de métodos, como Len() int e At(int) T, agora também possuem métodos que retornam iteradores, permitindo simplificar o código como este:

params := fn.Type.(*types.Signature).Params() for i := 0; i < params.Len(); i++ { use(params.At(i)) }

Para este:

for param := range fn.Signature().Params().Variables() { use(param) }

Métodos: Interface.EmbeddedTypes Interface.ExplicitMethods Interface.Methods MethodSet.Methods Named.Methods Scope.Children Struct.Fields Tuple.Variables TypeList.Types TypeParamList.TypeParams Union.Terms

hash/*

log/slog

Novo DiscardHandler é um manipulador que nunca é ativado e sempre descarta sua saída.

Nível e LevelVar agora implementam a interface encoding.TextAppender.

math/*

net

ListenCondig agora usa MPTCP por padrão em sistemas que o suportam (por enquanto, apenas Linux).

IP agora implementa a interface encoding.TextAppender.

net/http

Mudou a restrição Transport nas respostas informativas recebidas 1xx em resposta a um pedido. Antes, isso interrompia o pedido e retornava um erro após receber mais de 5 respostas 1xx. Agora, isso retorna um erro apenas se o tamanho total de todas as respostas 1xx exceder a configuração Transport.MaxResponseHeaderBytes.

Além disso, quando um pedido possui um hook para rastreamento net/http/httptrace.ClientTrace.Got1xxResponse, agora não há limite no número total de respostas 1xx. O hook Got1xxResponse pode retornar um erro para interromper o pedido.

Transport e Servidor agora tem um campo HTTP2 que permite a configuração das definições do protocolo HTTP/2.

Novos campos Server.Protocols e Transport.Protocols oferecem uma maneira simples de configurar quais protocolos o servidor ou cliente HTTP utiliza.

O servidor e o cliente podem ser configurados para suportar conexões não criptografadas HTTP/2.

Quando Server.Protocols contém UnencrypterHTTP2, o servidor aceitará conexões HTTP/2 em portas não criptografadas. O servidor pode aceitar tanto HTTP/1 quanto HTTP/2 não criptografado na mesma porta.

Quando Transport.Protocols contém UnencryptedHTTP2 e não contém HTTP1, o transporte usará HTTP/2 não criptografado para endereços http://. Se o transporte estiver configurado para usar HTTP/1 e HTTP/2 não criptografado simultaneamente, ele utilizará o HTTP/1.

O suporte para HTTP/2 não criptografado utiliza "HTTP/2 com conhecimento prévio" (RFC 9113, seção 3.3). O cabeçalho obsoleto “Upgrade: h2c” não é suportado.

net/netip

Addr, AddrPort e Prefix agora implementam interfaces encoding.BinaryAppender e encoding.TextAppender.

net/url

URL agora também implementa a interface encoding.BinaryAppender.

os/user

No Windows Atual agora pode ser usado no Windows Nano Server. A implementação foi atualizada para evitar o uso de funções da biblioteca NetApi32, que está ausente no Nano Server.

No Windows Atual, Lookup e LookupId agora suportam as seguintes contas de serviço incorporadas:

  • NT AUTHORITYSYSTEM
  • NT AUTHORITYLOCAL SERVICE
  • NT AUTHORITYNETWORK SERVICE

No Windows Atual foi significativamente acelerado quando o usuário atual está conectado a um domínio lento, o que é um caso comum para muitos usuários corporativos. O novo desempenho da implementação agora está na ordem de milissegundos, em comparação com a implementação anterior, que poderia levar vários segundos, até minutos, para concluir.

No Windows Atual agora retorna o usuário proprietário do processo, quando a thread atual se passa por outro usuário. Anteriormente, isso retornava um erro.

regexp

Regexp agora implementa a interface encoding.TextAdapter.

runtime

Função GOROOT agora foi declarada obsoleta. No novo código, deve-se preferir o uso do caminho do sistema para encontrar o binário “go”, e usar go env GOROOT para definir GOROOT.

strings

Pacote strings adiciona várias funções para trabalhar com iteradores:

  • Lines retorna um iterador para linhas separadas por nova linha na string.
  • SplitSeq retorna um iterador para todas as substrings da string, separadas pelo delimitador.
  • SplitAfterSeq retorna um iterador para substrings da string, separadas após cada ocorrência do delimitador.
  • FieldsSeq retorna um iterador para substrings da string ao redor de sequências de espaços em branco, conforme definidounicode.IsSpace
  • FieldsFuncSeq retorna um iterador para substrings da string ao redor de sequências de pontos de código Unicode que atendem ao predicado.

sync

Implementação sync.Map foi alterada, melhorando o desempenho, especialmente para alterações em dicionários. Por exemplo, é menos provável que haja competição entre alterações em conjuntos não sobrepostos em dicionários grandes, e não requer mais tempo de acumulação para alcançar um dicionário com baixa competição.

Se você encontrar algum problema, defina GOEXPERIMENT=nosynchashtriemap durante a construção para voltar à implementação antiga e, por favor, preencha o formulário de problemas.

testing

Novos Métodos T.Context e B.Context retornam o contexto que é cancelado após a conclusão do teste e antes da execução das funções de limpeza do teste.

Novos Métodos T.Chdir e B.Chdir podem ser usados para alterar o diretório de trabalho durante a execução do teste ou benchmark.

text/template

Templates agora suportam range-over-func e range-over-int.

time

Tempo agora implementa as interfaces encoding.BinaryAppender e encoding.TextAppender.

Ports

Linux

Como foi declarado nas notas de lançamento do Go 1.23, o Go 1.24 requer o kernel Linux versão 3.2 ou superior.

Darwin

O Go 1.24 é o último lançamento que funcionará no macOS 11 Big Sur. O Go 1.25 exigirá o macOS 12 Monterey ou posterior.

WebAssembly

A diretiva do compilador go:wasmexport foi adicionada aos programas Go para exportar funções para o host WebAssembly.

Na Preview 1 da WebAssembly System Interface (GOOS=wasip1 GOARCH=wasm), o Go 1.24 suporta a construção de programas Go como reactor/library especificando a flag de construção -buildmode=c-shared.

Mais tipos agora são permitidos como tipos de argumento ou resultado para funções go:wasmimport. Em particular, bool, string, uintptr e ponteiros para certos tipos são permitidos (detalhes podem ser vistos em documentação), junto com tipos inteiros de 32 e 64 bits e tipos de ponto flutuante, e unsafe.Pointer, que já eram permitidos. Esses tipos também são permitidos como tipos de argumento ou resultado para funções go:wasmexport.

Os arquivos de suporte para WebAssembly foram movidos para lib/wasm de misc/wasm.

O tamanho da memória original foi significativamente reduzido, especialmente para pequenos aplicativos WebAssembly.

Windows

A porta de 32 bits windows/arm (GOOS=windows GOARCH=arm) foi marcada como quebrada. Detalhes em #70705

Fonte: linux.org.ru

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