21 min read

Lançamento Go 1.18

Lançamento Go 1.18
Photo by Mohammad Rahmani / Unsplash

Introdução ao Go 1.18

A versão mais recente do Go, a versão 1.18, é uma versão significativa, incluindo alterações na linguagem, implementação da cadeia de ferramentas, tempo de execução e bibliotecas. O Go 1.18 chega sete meses após o Go 1.17 . Como sempre, o lançamento mantém a promessa de compatibilidade do Go 1 . Esperamos que quase todos os programas Go continuem a compilar e rodar como antes.

Mudanças no idioma

Genéricos

O Go 1.18 inclui uma implementação de recursos genéricos conforme descrito pela Proposta de Parâmetros de Tipo . Isso inclui alterações importantes - mas totalmente compatíveis com versões anteriores - no idioma.

Essas novas alterações de idioma exigiram uma grande quantidade de novo código que não teve testes significativos nas configurações de produção. Isso só acontecerá à medida que mais pessoas escreverem e usarem código genérico. Acreditamos que este recurso está bem implementado e de alta qualidade. No entanto, ao contrário da maioria dos aspectos do Go, não podemos apoiar essa crença com a experiência do mundo real. Portanto, embora encorajemos o uso de genéricos onde fizer sentido, tenha cuidado ao implantar código genérico em produção.

Embora acreditemos que os novos recursos de linguagem sejam bem projetados e claramente especificados, é possível que tenhamos cometido erros. Queremos salientar que a garantia de compatibilidade Go 1diz "Se for necessário resolver uma inconsistência ou incompletude na especificação, resolver o problema pode afetar o significado ou a legalidade dos programas existentes. Reservamo-nos o direito de resolver tais problemas, incluindo a atualização das implementações." Ele também diz "Se um compilador ou biblioteca tiver um bug que viole a especificação, um programa que depende do comportamento do bug pode quebrar se o bug for corrigido. Reservamos o direito de corrigir esses bugs." Em outras palavras, é possível que haja código usando genéricos que funcionarão com a versão 1.18, mas quebrarão em versões posteriores. Não planejamos ou esperamos fazer tal mudança. No entanto, interromper programas 1.18 em versões futuras pode se tornar necessário por motivos que não podemos prever hoje.

A seguir está uma lista das alterações mais visíveis. Para uma visão geral mais abrangente, consulte a proposta . Para obter detalhes, consulte a especificação do idioma .

  • A sintaxe para declarações de função e tipo agora aceita parâmetros de tipo .
  • Funções e tipos parametrizados podem ser instanciados seguindo-os com uma lista de argumentos de tipo entre colchetes.
  • O novo token ~foi adicionado ao conjunto de operadores e pontuação .
  • A sintaxe para tipos de interface agora permite a incorporação de tipos arbitrários (não apenas nomes de tipos de interfaces), bem como ~Telementos de união e tipo. Essas interfaces só podem ser usadas como restrições de tipo. Uma interface agora define um conjunto de tipos, bem como um conjunto de métodos.
  • O novo identificador pré any -declarado é um alias para a interface vazia. Pode ser usado em vez de interface{}.
  • O novo identificador pré comparable -declarado é uma interface que denota o conjunto de todos os tipos que podem ser comparados usando ==ou !=. Ele só pode ser usado como (ou incorporado) uma restrição de tipo.

Existem três pacotes experimentais usando genéricos que podem ser úteis. Esses pacotes estão no repositório x/exp; sua API não é coberta pela garantia Go 1 e pode mudar à medida que ganhamos mais experiência com genéricos.golang.org/x/exp/constraints

Restrições que são úteis para código genérico, como constraints.Ordered.golang.org/x/exp/slices

Uma coleção de funções genéricas que operam em fatias de qualquer tipo de elemento.golang.org/x/exp/maps

Uma coleção de funções genéricas que operam em mapas de qualquer tipo de chave ou elemento.

A implementação de genéricos atual tem as seguintes limitações conhecidas:

  • O compilador Go não pode manipular declarações de tipo dentro de funções ou métodos genéricos. Esperamos fornecer suporte para esse recurso no Go 1.19.
  • O compilador Go não aceita argumentos do tipo parâmetro type com as funções pré-declaradas real, image complex. Esperamos remover essa restrição no Go 1.19.
  • O compilador Go só dá suporte à chamada de um método mem um valor xde tipo de parâmetro de tipo Pse mfor explicitamente declarado pela Pinterface de restrição de . Da mesma forma, valores x.mde método e expressões de método P.mtambém são suportados apenas se mforem declarados explicitamente por P, mesmo que mpossam estar no conjunto de métodos Pem virtude do fato de que todos os tipos em Pimplement m. Esperamos remover essa restrição no Go 1.19.
  • O compilador Go não dá suporte ao acesso a um campo struct x.f onde xé do tipo de parâmetro de tipo, mesmo que todos os tipos no conjunto de tipos do parâmetro de tipo tenham um campo f. Podemos remover essa restrição no Go 1.19.
  • A incorporação de um parâmetro de tipo ou um ponteiro para um parâmetro de tipo, como um campo sem nome em um tipo de estrutura não é permitido. Da mesma forma, a incorporação de um parâmetro de tipo em um tipo de interface não é permitida. Se estes serão permitidos não está claro no momento.
  • Um elemento de união com mais de um termo não pode conter um tipo de interface com um conjunto de métodos não vazio. Se isso será permitido não está claro no momento.

Os genéricos também representam uma grande mudança para o ecossistema Go. Embora tenhamos atualizado várias ferramentas principais com suporte a genéricos, há muito mais a fazer. Levará tempo para que as ferramentas, documentação e bibliotecas restantes acompanhem essas mudanças de linguagem.

Correções de bugs

O compilador Go 1.18 agora relata corretamente declared but not usederros para variáveis ​​que são definidas dentro de um literal de função, mas nunca são usadas. Antes do Go 1.18, o compilador não reportava um erro nesses casos. Isso corrige o problema de compilador #8560 há muito pendente . Como resultado dessa alteração, os programas (possivelmente incorretos) podem não compilar mais. A correção necessária é simples: corrija o programa se estiver de fato incorreto ou use a variável incorreta, por exemplo, atribuindo-a ao identificador em branco _. Como go vetsempre apontou esse erro, o número de programas afetados provavelmente é muito pequeno.

O compilador Go 1.18 agora relata um estouro ao passar uma expressão de constante de runa, '1' << 32como um argumento para as funções pré-declaradas printe println, consistente com o comportamento das funções definidas pelo usuário. Antes do Go 1.18, o compilador não relatava um erro nesses casos, mas aceitava silenciosamente esses argumentos constantes se eles se encaixassem em um arquivo int64. Como resultado dessa alteração, os programas (possivelmente incorretos) podem não compilar mais. A correção necessária é simples: corrija o programa se estiver de fato incorreto ou converta explicitamente o argumento incorreto para o tipo correto. Como go vetsempre apontou esse erro, o número de programas afetados provavelmente é muito pequeno.

Portas

AMD64

O Go 1.18 apresenta a nova GOAMD64variável de ambiente, que seleciona em tempo de compilação uma versão de destino mínima da arquitetura AMD64. Os valores permitidos são v1, v2, v3ou v4. Cada nível superior requer e tira proveito de recursos adicionais do processador. Uma descrição detalhada pode ser encontrada aqui .

A GOAMD64variável de ambiente tem como padrão v1.

RISC-V

A arquitetura RISC-V de 64 bits no Linux (a linux/riscv64porta) agora suporta os modos de compilação c-archivee .c-shared

Linux

Go 1.18 requer kernel Linux versão 2.6.32 ou posterior.

janelas

As portas windows/arme windows/arm64agora suportam preempção não cooperativa, trazendo essa capacidade para todas as quatro portas do Windows, que devem resolver bugs sutis encontrados ao chamar funções do Win32 que bloqueiam por longos períodos de tempo.

iOS

No iOS (a ios/arm64porta) e no simulador de iOS executado no macOS baseado em AMD64 (a ios/amd64porta), o Go 1.18 agora requer o iOS 12 ou posterior; o suporte para versões anteriores foi descontinuado.

FreeBSD

Go 1.18 é a última versão suportada no FreeBSD 11.x, que já chegou ao fim da vida útil. Go 1.19 exigirá FreeBSD 12.2+ ou FreeBSD 13.0+. O FreeBSD 13.0+ exigirá um kernel com a opção COMPAT_FREEBSD12 definida (este é o padrão).

Ferramentas

Fuzzing

O Go 1.18 inclui uma implementação de fuzzing conforme descrito pela proposta de fuzzing .

Veja a página de destino fuzzing para começar.

Esteja ciente de que o fuzzing pode consumir muita memória e pode afetar o desempenho da sua máquina enquanto ela é executada. Esteja ciente também de que o mecanismo de fuzzing grava valores que expandem a cobertura de teste para um diretório de cache de fuzz $GOCACHE/fuzzenquanto ele é executado. Atualmente, não há limite para o número de arquivos ou bytes totais que podem ser gravados no cache fuzz, portanto, ele pode ocupar uma grande quantidade de armazenamento (possivelmente vários GBs).

Comando ir

go get

go getnão compila mais ou instala pacotes no modo de reconhecimento de módulo. go getagora é dedicado a ajustar dependências no go.mod. Efetivamente, o -dsinalizador está sempre habilitado. Para instalar a versão mais recente de um executável fora do contexto do módulo atual, use go install example.com/[email protected]. Qualquer consulta de versão pode ser usada em vez de latest. Essa forma de go installfoi adicionada no Go 1.16, portanto, os projetos que suportam versões mais antigas podem precisar fornecer instruções de instalação para go installe go get. go getagora relata um erro quando usado fora de um módulo, pois não há go.modarquivo para atualizar. No modo GOPATH (com GO111MODULE=off), go getainda compila e instala pacotes, como antes.

Automático go.mode go.sumatualizações

Os subcomandos , , e não atualizam mais go mod graphautomaticamente go mod vendoros go mod verifyarquivos e . (Esses arquivos podem ser atualizados explicitamente usando , ou .) go mod whygo.modgo.sumgo getgo mod tidygo mod download

go version

O gocomando agora incorpora informações de controle de versão em binários. Ele inclui a revisão atualmente em check-out, o tempo de confirmação e um sinalizador indicando se há arquivos editados ou não rastreados. As informações de controle de versão são incorporadas se o gocomando for invocado em um diretório dentro de um repositório Git, Mercurial, Fossil ou Bazaar, e o mainpacote e seu módulo principal contido estiverem no mesmo repositório. Esta informação pode ser omitida usando o sinalizador -buildvcs=false.

Além disso, o gocomando incorpora informações sobre a compilação, incluindo tags de compilação e ferramenta (definidas com -tags), sinalizadores de compilador, montador e vinculador (como -gcflags), se o cgo foi ativado e, se foi, os valores das variáveis ​​de ambiente cgo (como CGO_CFLAGS). As informações de VCS e de compilação podem ser lidas junto com as informações do módulo usando go version -m fileou runtime/debug.ReadBuildInfo(para o binário em execução no momento) ou o novo debug/buildinfo pacote.

O formato de dados subjacente das informações de compilação incorporadas pode mudar com novas versões go, portanto, uma versão mais antiga do gopode não manipular as informações de compilação produzidas com uma versão mais recente do go. Para ler as informações de versão de um binário construído com go1.18, use o go versioncomando e o debug/buildinfopacote de go1.18+.

go mod download

Se o arquivo do módulo principal go.modespecificar go 1.17 ou superior, go mod downloadsem argumentos agora baixa o código-fonte apenas para os módulos explicitamente necessáriosgo.mod no arquivo do módulo principal . (Em um go 1.17módulo ou superior, esse conjunto já inclui todas as dependências necessárias para construir os pacotes e testes no módulo principal.) Para baixar também o código-fonte para dependências transitivas, use go mod download all.

go mod vendor

O go mod vendorsubcomando agora suporta um -osinalizador para definir o diretório de saída. (Outros gocomandos ainda são lidos do vendor diretório na raiz do módulo ao carregar pacotes com -mod=vendor, portanto, o uso principal desse sinalizador é para ferramentas de terceiros que precisam coletar o código-fonte do pacote.)

go mod tidy

O go mod tidycomando agora retém somas de verificação adicionais no go.sumarquivo para módulos cujo código-fonte é necessário para verificar se cada pacote importado é fornecido por apenas um módulo na lista de compilação . Como essa condição é rara e a falha em aplicá-la resulta em um erro de compilação, essa alteração não está condicionada à versão no arquivo godo módulo principal .go.mod

go work

O gocomando agora suporta um modo "Workspace". Se um go.workarquivo for encontrado no diretório de trabalho ou em um diretório pai, ou um for especificado usando a GOWORK variável de ambiente, ele colocará o gocomando no modo de espaço de trabalho. No modo de espaço de trabalho, o go.workarquivo será usado para determinar o conjunto de módulos principais usados ​​como raízes para a resolução do módulo, em vez de usar o go.mod arquivo normalmente encontrado para especificar o único módulo principal. Para mais informações consulte a go work documentação.

go build -asan

O go buildcomando e os comandos relacionados agora suportam um -asansinalizador que permite a interoperação com o código C (ou C++) compilado com o desinfetante de endereço (opção do compilador C -fsanitize=address).

go test

O gocomando agora suporta opções de linha de comando adicionais para o novo suporte de fuzzing descrito acima :

  • go testsuporta -fuzz, -fuzztimee -fuzzminimizetimeopções. Para documentação sobre estes ver go help testflag.
  • go cleansuporta uma -fuzzcache opção. Para documentação ver go help clean.

//go:buildlinhas

O Go 1.17 introduziu //go:buildlinhas como uma maneira mais legível de escrever restrições de construção, em vez de // +buildlinhas. A partir do Go 1.17, gofmtadiciona //go:buildlinhas para corresponder às +buildlinhas existentes e as mantém sincronizadas, enquanto go vetdiagnostica quando estão fora de sincronia.

Como o lançamento do Go 1.18 marca o fim do suporte ao Go 1.16, todas as versões suportadas do Go agora entendem //go:buildas linhas. No Go 1.18, go fixagora remove as // +buildlinhas agora obsoletas nos módulos declarando go 1.17ou posteriormente em seus go.modarquivos.

Para obter mais informações, consulte https://go.dev/design/draft-gobuild .

Gofmt

gofmtagora lê e formata arquivos de entrada simultaneamente, com um limite de memória proporcional a GOMAXPROCS. Em uma máquina com várias CPUs, gofmtagora deve ser significativamente mais rápido.

Veterinario

Atualizações para genéricos

A vetferramenta é atualizada para oferecer suporte a código genérico. Na maioria dos casos, ele relata um erro no código genérico sempre que relata um erro no código não genérico equivalente após substituir os parâmetros de tipo por um tipo de seu conjunto de tipos . Por exemplo, vetrelata um erro de formato emfunc Imprimir[T ~int|~string](t T) { fmt.Printf("%d", t)}porque reportaria um erro de formato no equivalente não genérico de Print[string]:func PrintString(x string) { fmt.Printf("%d", x)}

Melhorias de precisão para verificadores existentes

Os cmd/vetverificadores copylock, printf, sortslice, testinggoroutinee tests todos tiveram melhorias de precisão moderadas para lidar com padrões de código adicionais. Isso pode levar a erros relatados recentemente em pacotes existentes. Por exemplo, o printfverificador agora rastreia strings de formatação criadas pela concatenação de constantes de string. Então vetirá relatar um erro em:  // A diretiva de formatação fmt.Printf %d está sendo passada para Println.  fmt.Println("%d"+` ≡ x (mod 2)`+"\n", x%2)

Tempo de execução

O coletor de lixo agora inclui fontes não heap do trabalho do coletor de lixo (por exemplo, varredura de pilha) ao determinar com que frequência executar. Como resultado, a sobrecarga do coletor de lixo é mais previsível quando essas origens são significativas. Para a maioria das aplicações, essas mudanças serão insignificantes; no entanto, alguns aplicativos Go agora podem usar menos memória e gastar mais tempo na coleta de lixo, ou vice-versa, do que antes. A solução pretendida é ajustar GOGCquando necessário.

O tempo de execução agora retorna a memória para o sistema operacional com mais eficiência e foi ajustado para funcionar de forma mais agressiva como resultado.

Go 1.17 geralmente melhorou a formatação de argumentos em rastreamentos de pilha, mas pode imprimir valores imprecisos para argumentos passados ​​em registros. Isso é aprimorado no Go 1.18 imprimindo um ponto de interrogação ( ?) após cada valor que pode ser impreciso.

A função appendinterna agora usa uma fórmula ligeiramente diferente ao decidir quanto aumentar uma fatia quando deve alocar uma nova matriz subjacente. A nova fórmula é menos propensa a transições repentinas no comportamento de alocação.

Compilador

O Go 1.17 implementou uma nova maneira de passar argumentos e resultados de funções usando registradores em vez da pilha na arquitetura x86 de 64 bits em sistemas operacionais selecionados. O Go 1.18 expande as plataformas suportadas para incluir ARM de 64 bits ( GOARCH=arm64), PowerPC de 64 bits big e little-endian ( GOARCH=ppc64, ppc64le), bem como arquitetura x86 de 64 bits ( GOARCH=amd64) em todos os sistemas operacionais. Em sistemas ARM de 64 bits e PowerPC de 64 bits, o benchmarking mostra melhorias de desempenho típicas de 10% ou mais.

Conforme mencionado nas notas de versão do Go 1.17, essa alteração não afeta a funcionalidade de nenhum código Go seguro e foi projetada para não ter impacto na maioria dos códigos assembly. Consulte as notas de versão do Go 1.17 para obter mais detalhes.

O compilador agora pode inline funções que contêm loops de intervalo ou rotulados para loops.

A nova -asanopção do compilador oferece suporte à nova opção de gocomando -asan.

Como o verificador de tipos do compilador foi totalmente substituído para oferecer suporte a genéricos, algumas mensagens de erro agora podem usar palavras diferentes das anteriores. Em alguns casos, as mensagens de erro pré-Go 1.18 forneceram mais detalhes ou foram redigidas de maneira mais útil. Pretendemos abordar esses casos no Go 1.19.

Devido a mudanças no compilador relacionadas ao suporte a genéricos, a velocidade de compilação do Go 1.18 pode ser aproximadamente 15% mais lenta que a velocidade de compilação do Go 1.17. O tempo de execução do código compilado não é afetado. Pretendemos melhorar a velocidade do compilador no Go 1.19.

Ligador

O vinculador emite muito menos realocações . Como resultado, a maioria das bases de código será vinculada mais rapidamente, exigirá menos memória para vincular e gerará binários menores. Ferramentas que processam binários Go devem usar o debug/gosympacote Go 1.18 para lidar de forma transparente com binários antigos e novos.

A nova -asanopção de vinculador oferece suporte à nova opção de gocomando -asan.

Bootstrap

Ao compilar uma versão Go a partir da fonte e GOROOT_BOOTSTRAP não estiver definida, as versões anteriores do Go procuraram uma cadeia de ferramentas de bootstrap Go 1.4 ou posterior no diretório $HOME/go1.4( %HOMEDRIVE%%HOMEPATH%\go1.4no Windows). Vá agora procura primeiro $HOME/go1.17ou $HOME/sdk/go1.17 antes de voltar a $HOME/go1.4. Pretendemos que o Go 1.19 exija o Go 1.17 ou posterior para bootstrap, e essa mudança deve tornar a transição mais suave. Para obter mais detalhes, consulte go.dev/issue/44505 .

Biblioteca principal

Novo debug/buildinfopacote

O novo debug/buildinfopacote fornece acesso a versões de módulo, informações de controle de versão e sinalizadores de compilação incorporados em arquivos executáveis ​​criados pelo gocomando. A mesma informação também está disponível via runtime/debug.ReadBuildInfo para o binário atualmente em execução e via go version -mna linha de comando.

Novo net/netippacote

O novo net/netip pacote define um novo tipo de endereço IP, Addr. Comparado com o net.IPtipo existente, o netip.Addrtipo usa menos memória, é imutável e comparável, portanto, suporta == e pode ser usado como uma chave de mapa.

Além de Addr, o pacote define AddrPort, representando um IP e uma porta, e Prefix, representando um prefixo CIDR de rede.

O pacote também define várias funções para criar e examinar esses novos tipos: AddrFrom4, AddrFrom16, AddrFromSlice, AddrPortFrom, IPv4Unspecified, IPv6LinkLocalAllNodes, IPv6Unspecified, MustParseAddr, MustParseAddrPort, MustParsePrefix, ParseAddr, ParseAddrPort, ParsePrefix, PrefixFrom.

O netpacote inclui novos métodos que são paralelos aos métodos existentes, mas retornam em vez dos tipos netip.AddrPortmais pesados : , , , , . Os novos métodos suportam E/S sem alocação. net.IP*net.UDPAddrResolver.LookupNetIPUDPConn.ReadFromUDPAddrPortUDPConn.ReadMsgUDPAddrPortUDPConn.WriteToUDPAddrPortUDPConn.WriteMsgUDPAddrPortUDPConn

O netpacote agora também inclui funções e métodos para converter entre os tipos TCPAddr/ existentes e : , , , . UDPAddrnetip.AddrPortTCPAddrFromAddrPortUDPAddrFromAddrPortTCPAddr.AddrPortUDPAddr.AddrPort

TLS 1.0 e 1.1 desabilitados por padrão do lado do cliente

Se Config.MinVersion não estiver definido, agora o padrão é TLS 1.2 para conexões de cliente. Espera-se que qualquer servidor atualizado com segurança dê suporte ao TLS 1.2, e os navegadores o exigem desde 2020. O TLS 1.0 e 1.1 ainda são compatíveis com a configuração Config.MinVersionde VersionTLS10. O padrão do lado do servidor permanece inalterado no TLS 1.0.

O padrão pode ser revertido temporariamente para TLS 1.0 definindo a GODEBUG=tls10default=1variável de ambiente. Esta opção será removida no Go 1.19.

Rejeitando certificados SHA-1

crypto/x509agora rejeitará certificados assinados com a função de hash SHA-1. Isso não se aplica a certificados raiz autoassinados. Ataques práticos contra SHA-1 foram demonstrados desde 2017 e as Autoridades de Certificação publicamente confiáveis ​​não emitem certificados SHA-1 desde 2015.

Isso pode ser revertido temporariamente definindo a GODEBUG=x509sha1=1variável de ambiente. Esta opção será removida no Go 1.19.

Pequenas alterações na biblioteca

Como sempre, existem várias pequenas alterações e atualizações na biblioteca, feitas com a promessa de compatibilidade do Go 1 em mente.búfalo

O novo Writer.AvailableBuffer método retorna um buffer vazio com uma capacidade possivelmente não vazia para uso com APIs do tipo append. Após anexar, o buffer pode ser fornecido a uma Writechamada subsequente e possivelmente evitar qualquer cópia.

Os métodos Reader.Resete Writer.Resetagora usam o tamanho de buffer padrão quando chamados em objetos com um nilbuffer.bytes

A nova Cutfunção fatia a []byteem torno de um separador. Ele pode substituir e simplificar muitos usos comuns de Index, IndexByte, IndexRunee SplitN.

Trim, TrimLeft, e TrimRightagora são livres de alocação e, especialmente para pequenos conjuntos de cortes ASCII, até 10 vezes mais rápidos.

A Titlefunção agora está obsoleta. Ele não lida com pontuação Unicode e regras de capitalização específicas do idioma e é substituído pelo pacote golang.org/x/text/cases .criptografia/elíptica

As implementações P224, P384, e P521curve agora são todas apoiadas por código gerado pelos projetos addchain e fiat-crypto , o último dos quais é baseado em um modelo formalmente verificado das operações aritméticas. Eles agora usam fórmulas completas mais seguras e APIs internas. P-224 e P-384 são agora aproximadamente quatro vezes mais rápidos. Todas as implementações de curvas específicas agora são de tempo constante.

Operar em pontos de curva inválidos (aqueles para os quais o IsOnCurvemétodo retorna falso e que nunca são retornados por Unmarshalou um Curvemétodo operando em um ponto válido) sempre foi um comportamento indefinido, pode levar a ataques de recuperação de chave e agora não é suportado pelo novo back-end . Se um ponto inválido for fornecido a um método P224, P384ou P521, esse método agora retornará um ponto aleatório. O comportamento pode mudar para um pânico explícito em uma versão futura.criptografia/tls

O novo Conn.NetConn método permite acesso ao arquivo net.Conn.criptografia/x509

Certificate.Verify agora usa APIs de plataforma para verificar a validade do certificado no macOS e iOS quando é chamado com um nil VerifyOpts.Roots ou ao usar o pool raiz retornado do SystemCertPool.

SystemCertPool já está disponível no Windows.

No Windows, macOS e iOS, quando um CertPoolreturn by SystemCertPool tiver certificados adicionais adicionados a ele, Certificate.Verify fará duas verificações: uma usando as APIs do verificador de plataforma e as raízes do sistema e outra usando o verificador Go e as raízes adicionais. As cadeias retornadas pelas APIs do verificador de plataforma serão priorizadas.

CertPool.Subjects é preterido. No Windows, macOS e iOS, o CertPoolretornado por SystemCertPool retornará um pool que não inclui raízes do sistema na fatia retornada por Subjects, pois uma lista estática não pode representar adequadamente as políticas da plataforma e pode não estar disponível nas APIs da plataforma.

O suporte para assinatura de certificados usando algoritmos de assinatura que dependem dos hashes MD5 e SHA-1 ( MD5WithRSA, SHA1WithRSAe ECDSAWithSHA1) pode ser removido no Go 1.19.depurar/anão

As estruturas StructField and BasicType agora têm um DataBitOffsetcampo, que contém o valor do DW_AT_data_bit_offset atributo, se presente.depurar/elfo

A R_PPC64_RELATIVE constante foi adicionada.depurar/plan9obj

O método File.Symbols agora retorna o novo valor de erro exportado ErrNoSymbols se o arquivo não tiver seção de símbolo.ir/ast

De acordo com a proposta Adições para go/ast e go/token para suportar funções e tipos parametrizados, as seguintes adições são feitas ao go/astpacote:

  • os nós FuncType e têm um novo campo para armazenar parâmetros de tipo, se houver. TypeSpecTypeParams
  • O novo nó de expressão IndexListExpr representa expressões de índice com vários índices, usados ​​para instanciações de função e tipo com mais de um argumento de tipo explícito.

ir/constante

O novo Kind.String método retorna um nome legível para o tipo de receptor.ir/token

A nova constante TILDE representa o ~token conforme a proposta Adições para go/ast e go/token para dar suporte a funções e tipos parametrizados .ir/tipos

O novo Config.GoVersion campo define a versão de idioma Go aceita.

De acordo com a proposta Adições para go/types para suportar parâmetros de tipo, as seguintes adições são feitas ao go/typespacote:

  • O novo tipo TypeParam, a função de fábrica NewTypeParame os métodos associados são adicionados para representar um parâmetro de tipo.
  • O novo tipo TypeParamListcontém uma lista de parâmetros de tipo.
  • O novo tipo TypeListcontém uma lista de tipos.
  • A nova função de fábrica NewSignatureTypealoca Signatureparâmetros do tipo com (receptor ou função). Para acessar esses parâmetros de tipo, o Signaturetipo tem dois novos métodos Signature.RecvTypeParamse Signature.TypeParams.
  • Namedtipos têm quatro novos métodos: Named.Originobter os tipos parametrizados originais de tipos instanciados Named.TypeArgse Named.TypeParamsobter os argumentos de tipo ou parâmetros de tipo de um tipo instanciado ou parametrizado e Named.SetTypeParamsdefinir os parâmetros de tipo (por exemplo, ao importar um tipo nomeado onde a alocação de o tipo nomeado e a configuração dos parâmetros de tipo não podem ser feitos simultaneamente devido a possíveis ciclos).
  • O Interfacetipo tem quatro novos métodos: Interface.IsComparablee Interface.IsMethodSetpara consultar propriedades do conjunto de tipos definido pela interface Interface.MarkImplicite Interface.IsImplicitpara definir e testar se a interface é uma interface implícita em torno de um literal de restrição de tipo.
  • Os novos tipos Unione Term, funções de fábrica NewUnione NewTerm, e métodos associados são adicionados para representar conjuntos de tipos em interfaces.
  • A nova função Instantiate instancia um tipo parametrizado.
  • A nova Info.Instances função de registros de mapa e instanciações de tipo por meio do novo Instancetipo.
  • O novo tipo ArgumentError e os métodos associados são adicionados para representar um erro relacionado a um argumento de tipo.
  • O novo tipo Contexte a função de fábrica NewContext são adicionados para facilitar o compartilhamento de instâncias de tipo idênticos em pacotes com verificação de tipo, por meio do novo Config.Context campo.

Os predicados AssignableTo, ConvertibleTo, Implements, Identical, IdenticalIgnoreTagse AssertableTo agora também trabalham com argumentos que são ou contêm interfaces generalizadas, ou seja, interfaces que só podem ser usadas como restrições de tipo no código Go. Observe que o comportamento de AssignableTo, ConvertibleTo, Implementse AssertableToé indefinido com argumentos que são tipos genéricos não instanciados e AssertableToé indefinido se o primeiro argumento for uma interface generalizada.html/modelo

Dentro de um rangepipeline, o novo {{break}}comando encerrará o loop mais cedo e o novo {{continue}}comando iniciará imediatamente a próxima iteração do loop.

A andfunção não avalia mais sempre todos os argumentos; ele para de avaliar argumentos após o primeiro argumento avaliado como falso. Da mesma forma, a orfunção agora para de avaliar argumentos após o primeiro argumento avaliado como verdadeiro. Isso faz diferença se algum dos argumentos for uma chamada de função.imagem/desenho

As implementações Drawe DrawMaskfallback (usadas quando os argumentos não são os tipos de imagem mais comuns) agora são mais rápidas quando esses argumentos implementam as interfaces opcionais draw.RGBA64Image e image.RGBA64Image que foram adicionadas no Go 1.17.internet

net.Error.Temporaryfoi preterido.net/http

Em destinos WebAssembly, os campos , Diale método em agora serão usados ​​corretamente, se especificados, para fazer solicitações HTTP. DialContextDialTLSDialTLSContextTransport

O novo Cookie.Valid método informa se o cookie é válido.

A nova MaxBytesHandler função cria um Handlerque envolve seu ResponseWritere Request.Bodycom um MaxBytesReader.

Ao pesquisar um nome de domínio contendo caracteres não ASCII, a conversão de Unicode para ASCII agora é feita de acordo com o Processamento Não Transicional, conforme definido no padrão Unicode IDNA Compatibility Processing (UTS #46). A interpretação de quatro runas distintas foi alterada: ß, ς, juntador de largura zero U+200D e não juntador de largura zero U+200C. O processamento não transicional é consistente com a maioria dos aplicativos e navegadores da web.sistema operacional/usuário

User.GroupIds agora usa uma implementação nativa Go quando cgo não está disponível.refletir

Os métodos new Value.SetIterKey e definem um valor usando um iterador de mapa como a origem. Value.SetIterValueEles são equivalentes a Value.Set(iter.Key())e Value.Set(iter.Value()), mas fazem menos alocações.

O novo Value.UnsafePointer método retorna o valor do Value como um arquivo unsafe.Pointer. Isso permite que os chamadores migrem de Value.UnsafeAddr e Value.Pointer eliminem a necessidade de realizar conversões de uintptr para unsafe.Pointer no local de chamada (como as regras unsafe.Pointer exigem).

O novo MapIter.Reset método altera seu receptor para iterar em um mapa diferente. O uso de MapIter.Reset permite iteração livre de alocação em muitos mapas.

Vários métodos ( Value.CanInt, Value.CanUint, Value.CanFloat, Value.CanComplex ) foram adicionados Value para testar se uma conversão é segura.

Value.FieldByIndexErr foi adicionado para evitar o pânico que ocorre Value.FieldByIndex ao percorrer um ponteiro nil para uma estrutura incorporada.

reflect.Ptre reflect.PtrTo foram renomeados para reflect.Pointere reflect.PointerTo, respectivamente, para consistência com o restante do pacote reflect. Os nomes antigos continuarão funcionando, mas serão preteridos em uma versão futura do Go.regexp

regexp agora trata cada byte inválido de uma string UTF-8 como U+FFFD.tempo de execução/depuração

A BuildInfo estrutura tem dois novos campos, contendo informações adicionais sobre como o binário foi construído:

  • GoVersion contém a versão do Go usada para construir o binário.
  • Settings é uma fatia de BuildSettings structs contendo pares de chave/valor que descrevem a construção.

tempo de execução/pprof

O criador de perfil de CPU agora usa temporizadores por thread no Linux. Isso aumenta o uso máximo da CPU que um perfil pode observar e reduz algumas formas de viés.strconv

strconv.Unquote agora rejeita metades substitutas Unicode.cordas

A nova Cutfunção fatia a stringem torno de um separador. Ele pode substituir e simplificar muitos usos comuns de Index, IndexByte, IndexRunee SplitN.

A nova Clonefunção copia a entrada stringsem o clonado retornado stringreferenciando a memória da string de entrada.

Trim, TrimLeft, e TrimRightagora são livres de alocação e, especialmente para pequenos conjuntos de cortes ASCII, até 10 vezes mais rápidos.

A Titlefunção agora está obsoleta. Ele não lida com pontuação Unicode e regras de capitalização específicas do idioma e é substituído pelo pacote golang.org/x/text/cases .sincronizar

Os novos métodos Mutex.TryLock, RWMutex.TryLock, e RWMutex.TryRLock, adquirirão o bloqueio se ele não estiver retido no momento.syscall

A nova função SyscallN foi introduzida para Windows, permitindo chamadas com um número arbitrário de argumentos. Como resultado, Syscall, Syscall6, Syscall9, Syscall12, Syscall15e Syscall18estão obsoletos em favor de SyscallN.

SysProcAttr.Pdeathsig agora é suportado no FreeBSD.syscall/js

A Wrapperinterface foi removida.testando

A precedência de /no argumento para -rune -benchfoi aumentada. A/B|C/Dcostumava ser tratado como A/(B|C)/De agora é tratado como (A/B)|(C/D).

Se a -runopção não selecionar nenhum teste, a -countopção será ignorada. Isso pode alterar o comportamento de testes existentes no caso improvável de que um teste altere o conjunto de subtestes que são executados sempre que a própria função de teste é executada.

O novo testing.Ftipo é usado pelo novo suporte de fuzzing descrito acima . -test.fuzzOs testes agora também suportam as opções de linha de comando -test.fuzztime, e -test.fuzzminimizetime.texto/modelo

Dentro de um rangepipeline, o novo {{break}}comando encerrará o loop mais cedo e o novo {{continue}}comando iniciará imediatamente a próxima iteração do loop.

A andfunção não avalia mais sempre todos os argumentos; ele para de avaliar argumentos após o primeiro argumento avaliado como falso. Da mesma forma, a orfunção agora para de avaliar argumentos após o primeiro argumento avaliado como verdadeiro. Isso faz diferença se algum dos argumentos for uma chamada de função.texto/modelo/análise

O pacote suporta o novo comando text/template e html/template {{break}} por meio da nova constante NodeBreak e do novo tipo BreakNode, e da mesma forma suporta o novo {{continue}}comando por meio da nova constante NodeContinue e do novo tipo ContinueNode.unicode/utf8

A nova AppendRunefunção anexa a codificação UTF-8 de a runea a []byte.

Fonte: go.dev