Lançamento Go 1.18
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
~T
elementos 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 deinterface{}
. - 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
,imag
ecomplex
. Esperamos remover essa restrição no Go 1.19. - O compilador Go só dá suporte à chamada de um método
m
em um valorx
de tipo de parâmetro de tipoP
sem
for explicitamente declarado pelaP
interface de restrição de . Da mesma forma, valoresx.m
de método e expressões de métodoP.m
também são suportados apenas sem
forem declarados explicitamente porP
, mesmo quem
possam estar no conjunto de métodosP
em virtude do fato de que todos os tipos emP
implementm
. Esperamos remover essa restrição no Go 1.19. - O compilador Go não dá suporte ao acesso a um campo struct
x.f
ondex
é do tipo de parâmetro de tipo, mesmo que todos os tipos no conjunto de tipos do parâmetro de tipo tenham um campof
. 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 used
erros 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 vet
sempre 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' << 32
como um argumento para as funções pré-declaradas print
e 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 vet
sempre apontou esse erro, o número de programas afetados provavelmente é muito pequeno.
Portas
AMD64
O Go 1.18 apresenta a nova GOAMD64
variá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
, v3
ou v4
. Cada nível superior requer e tira proveito de recursos adicionais do processador. Uma descrição detalhada pode ser encontrada aqui .
A GOAMD64
variável de ambiente tem como padrão v1
.
RISC-V
A arquitetura RISC-V de 64 bits no Linux (a linux/riscv64
porta) agora suporta os modos de compilação c-archive
e .c-shared
Linux
Go 1.18 requer kernel Linux versão 2.6.32 ou posterior.
janelas
As portas windows/arm
e windows/arm64
agora 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/arm64
porta) e no simulador de iOS executado no macOS baseado em AMD64 (a ios/amd64
porta), 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/fuzz
enquanto 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
get
não compila mais ou instala pacotes no modo de reconhecimento de módulo. go
get
agora é dedicado a ajustar dependências no go.mod
. Efetivamente, o -d
sinalizador 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
install
foi adicionada no Go 1.16, portanto, os projetos que suportam versões mais antigas podem precisar fornecer instruções de instalação para go
install
e go
get
. go
get
agora relata um erro quando usado fora de um módulo, pois não há go.mod
arquivo para atualizar. No modo GOPATH (com GO111MODULE=off
), go
get
ainda compila e instala pacotes, como antes.
Automático go.mod
e go.sum
atualizações
Os subcomandos , , e não atualizam mais go
mod
graph
automaticamente go
mod
vendor
os go
mod
verify
arquivos e . (Esses arquivos podem ser atualizados explicitamente usando , ou .) go
mod
why
go.mod
go.sum
go
get
go
mod
tidy
go
mod
download
go
version
O go
comando 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 go
comando for invocado em um diretório dentro de um repositório Git, Mercurial, Fossil ou Bazaar, e o main
pacote 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 go
comando 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
file
ou 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 go
pode 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 go
1.18, use o go
version
comando e o debug/buildinfo
pacote de go
1.18+.
go
mod
download
Se o arquivo do módulo principal go.mod
especificar go
1.17
ou superior, go
mod
download
sem 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.17
mó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
vendor
subcomando agora suporta um -o
sinalizador para definir o diretório de saída. (Outros go
comandos 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
tidy
comando agora retém somas de verificação adicionais no go.sum
arquivo 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 go
do módulo principal .go.mod
go
work
O go
comando agora suporta um modo "Workspace". Se um go.work
arquivo 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 go
comando no modo de espaço de trabalho. No modo de espaço de trabalho, o go.work
arquivo 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
build
comando e os comandos relacionados agora suportam um -asan
sinalizador 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 go
comando agora suporta opções de linha de comando adicionais para o novo suporte de fuzzing descrito acima :
go test
suporta-fuzz
,-fuzztime
e-fuzzminimizetime
opções. Para documentação sobre estes vergo help testflag
.go clean
suporta uma-fuzzcache
opção. Para documentação vergo help clean
.
//go:build
linhas
O Go 1.17 introduziu //go:build
linhas como uma maneira mais legível de escrever restrições de construção, em vez de //
+build
linhas. A partir do Go 1.17, gofmt
adiciona //go:build
linhas para corresponder às +build
linhas existentes e as mantém sincronizadas, enquanto go
vet
diagnostica 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:build
as linhas. No Go 1.18, go
fix
agora remove as //
+build
linhas agora obsoletas nos módulos declarando go
1.17
ou posteriormente em seus go.mod
arquivos.
Para obter mais informações, consulte https://go.dev/design/draft-gobuild .
Gofmt
gofmt
agora lê e formata arquivos de entrada simultaneamente, com um limite de memória proporcional a GOMAXPROCS
. Em uma máquina com várias CPUs, gofmt
agora deve ser significativamente mais rápido.
Veterinario
Atualizações para genéricos
A vet
ferramenta é 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, vet
relata 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/vet
verificadores copylock
, printf
, sortslice
, testinggoroutine
e 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 printf
verificador agora rastreia strings de formatação criadas pela concatenação de constantes de string. Então vet
irá 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 GOGC
quando 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 append
interna 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 -asan
opção do compilador oferece suporte à nova opção de go
comando -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/gosym
pacote Go 1.18 para lidar de forma transparente com binários antigos e novos.
A nova -asan
opção de vinculador oferece suporte à nova opção de go
comando -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.4
no Windows). Vá agora procura primeiro $HOME/go1.17
ou $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/buildinfo
pacote
O novo debug/buildinfo
pacote 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 go
comando. 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
-m
na linha de comando.
Novo net/netip
pacote
O novo net/netip
pacote define um novo tipo de endereço IP, Addr
. Comparado com o net.IP
tipo existente, o netip.Addr
tipo 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 net
pacote inclui novos métodos que são paralelos aos métodos existentes, mas retornam em vez dos tipos netip.AddrPort
mais pesados : , , , , . Os novos métodos suportam E/S sem alocação. net.IP
*net.UDPAddr
Resolver.LookupNetIP
UDPConn.ReadFromUDPAddrPort
UDPConn.ReadMsgUDPAddrPort
UDPConn.WriteToUDPAddrPort
UDPConn.WriteMsgUDPAddrPort
UDPConn
O net
pacote agora também inclui funções e métodos para converter entre os tipos TCPAddr
/ existentes e : , , , . UDPAddr
netip.AddrPort
TCPAddrFromAddrPort
UDPAddrFromAddrPort
TCPAddr.AddrPort
UDPAddr.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.MinVersion
de 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=1
variável de ambiente. Esta opção será removida no Go 1.19.
Rejeitando certificados SHA-1
crypto/x509
agora 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=1
variá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 Write
chamada subsequente e possivelmente evitar qualquer cópia.
Os métodos Reader.Reset
e Writer.Reset
agora usam o tamanho de buffer padrão quando chamados em objetos com um nil
buffer.bytes
A nova Cut
função fatia a []byte
em torno de um separador. Ele pode substituir e simplificar muitos usos comuns de Index
, IndexByte
, IndexRune
e SplitN
.
Trim
, TrimLeft
, e TrimRight
agora são livres de alocação e, especialmente para pequenos conjuntos de cortes ASCII, até 10 vezes mais rápidos.
A Title
funçã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 P521
curve 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 IsOnCurve
método retorna falso e que nunca são retornados por Unmarshal
ou um Curve
mé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
, P384
ou 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 CertPool
return 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 CertPool
retornado 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
, SHA1WithRSA
e ECDSAWithSHA1
) pode ser removido no Go 1.19.depurar/anão
As estruturas StructField
and BasicType
agora têm um DataBitOffset
campo, 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/ast
pacote:
- os nós
FuncType
e têm um novo campo para armazenar parâmetros de tipo, se houver.TypeSpec
TypeParams
- 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.
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/types
pacote:
- O novo tipo
TypeParam
, a função de fábricaNewTypeParam
e os métodos associados são adicionados para representar um parâmetro de tipo. - O novo tipo
TypeParamList
contém uma lista de parâmetros de tipo. - O novo tipo
TypeList
contém uma lista de tipos. - A nova função de fábrica
NewSignatureType
alocaSignature
parâmetros do tipo com (receptor ou função). Para acessar esses parâmetros de tipo, oSignature
tipo tem dois novos métodosSignature.RecvTypeParams
eSignature.TypeParams
. Named
tipos têm quatro novos métodos:Named.Origin
obter os tipos parametrizados originais de tipos instanciadosNamed.TypeArgs
eNamed.TypeParams
obter os argumentos de tipo ou parâmetros de tipo de um tipo instanciado ou parametrizado eNamed.SetTypeParams
definir 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
Interface
tipo tem quatro novos métodos:Interface.IsComparable
eInterface.IsMethodSet
para consultar propriedades do conjunto de tipos definido pela interfaceInterface.MarkImplicit
eInterface.IsImplicit
para definir e testar se a interface é uma interface implícita em torno de um literal de restrição de tipo. - Os novos tipos
Union
eTerm
, funções de fábricaNewUnion
eNewTerm
, 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 novoInstance
tipo. - 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
Context
e a função de fábricaNewContext
são adicionados para facilitar o compartilhamento de instâncias de tipo idênticos em pacotes com verificação de tipo, por meio do novoConfig.Context
campo.
Os predicados AssignableTo
, ConvertibleTo
, Implements
, Identical
, IdenticalIgnoreTags
e 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
, Implements
e 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 range
pipeline, o novo {{break}}
comando encerrará o loop mais cedo e o novo {{continue}}
comando iniciará imediatamente a próxima iteração do loop.
A and
funçã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 or
funçã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 Draw
e DrawMask
fallback (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.Temporary
foi preterido.net/http
Em destinos WebAssembly, os campos , Dial
e método em agora serão usados corretamente, se especificados, para fazer solicitações HTTP. DialContext
DialTLS
DialTLSContext
Transport
O novo Cookie.Valid
método informa se o cookie é válido.
A nova MaxBytesHandler
função cria um Handler
que envolve seu ResponseWriter
e Request.Body
com 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.SetIterValue
Eles 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.Ptr
e reflect.PtrTo
foram renomeados para reflect.Pointer
e 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 deBuildSettings
structs contendo pares de chave/valor que descrevem a construção.
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 Cut
função fatia a string
em torno de um separador. Ele pode substituir e simplificar muitos usos comuns de Index
, IndexByte
, IndexRune
e SplitN
.
A nova Clone
função copia a entrada string
sem o clonado retornado string
referenciando a memória da string de entrada.
Trim
, TrimLeft
, e TrimRight
agora são livres de alocação e, especialmente para pequenos conjuntos de cortes ASCII, até 10 vezes mais rápidos.
A Title
funçã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
, Syscall15
e Syscall18
estão obsoletos em favor de SyscallN
.
SysProcAttr.Pdeathsig
agora é suportado no FreeBSD.syscall/js
A Wrapper
interface foi removida.testando
A precedência de /
no argumento para -run
e -bench
foi aumentada. A/B|C/D
costumava ser tratado como A/(B|C)/D
e agora é tratado como (A/B)|(C/D)
.
Se a -run
opção não selecionar nenhum teste, a -count
opçã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.F
tipo é usado pelo novo suporte de fuzzing descrito acima . -test.fuzz
Os testes agora também suportam as opções de linha de comando -test.fuzztime
, e -test.fuzzminimizetime
.texto/modelo
Dentro de um range
pipeline, o novo {{break}}
comando encerrará o loop mais cedo e o novo {{continue}}
comando iniciará imediatamente a próxima iteração do loop.
A and
funçã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 or
funçã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 AppendRune
função anexa a codificação UTF-8 de a rune
a a []byte
.
Fonte: go.dev