← Voltar para o blog

Go 1.15: Novidades e Recursos

Descubra as principais novidades do Go 1.15, incluindo novos recursos, melhorias de performance e mudancas na biblioteca padrao.

Novidades do Go 1.15: Um Guia Detalhado

A versão 1.15 do Go, lançada em 11 de agosto de 2020, trouxe um conjunto significativo de melhorias e adições à linguagem. Focada na performance, segurança e usabilidade, esta versão consolidou o Go como uma ferramenta poderosa para o desenvolvimento de software moderno. Este artigo explora as principais mudanças e seus impactos práticos.

Compilador e Runtime

Melhorias no Garbage Collector (GC)

O Go 1.15 aprimorou significativamente o garbage collector. A principal mudança reside na otimização do agendamento do GC, reduzindo a latência e o overhead. Isso é particularmente notável em aplicações com alta alocação de memória.

  • Agendamento Otimizado: O agendamento do GC agora considera o tempo gasto em GC em ciclos anteriores, ajustando a frequência de execução para minimizar a latência.
  • Redução da Latência: A latência do GC foi reduzida em até 20% em alguns casos, resultando em uma experiência mais responsiva para aplicações interativas.

Essas melhorias tornam o Go 1.15 ainda mais adequado para aplicações sensíveis à latência e sistemas de alta performance.

Aperfeiçoamentos no Linker

O linker no Go 1.15 recebeu melhorias significativas, resultando em tempos de linkagem mais rápidos, especialmente para programas grandes. Essas otimizações incluem:

  • Paralelização: O linker agora aproveita melhor o paralelismo, distribuindo o trabalho entre múltiplos núcleos da CPU.
  • Otimização do Layout de Memória: Melhorias no layout de memória reduziram o tamanho dos binários e melhoraram o desempenho em tempo de execução.

Essas mudanças são cruciais para projetos grandes, onde os tempos de linkagem podem ser um gargalo significativo no processo de desenvolvimento.

Suporte a X.509 Common Name Deprecado

Para aumentar a segurança, o Go 1.15 desabilitou o suporte ao uso do campo Common Name em certificados X.509 por padrão. Este campo tem sido considerado obsoleto e inseguro há algum tempo. Agora, o Go exige que os certificados usem o Subject Alternative Name (SAN) para validação de nomes de domínio.

Para reabilitar o suporte ao Common Name (não recomendado, apenas para compatibilidade com sistemas legados), você pode definir a variável de ambiente GODEBUG=x509ignoreCN=0.

export GODEBUG=x509ignoreCN=0

É altamente recomendado migrar para o uso de SANs em vez de depender do Common Name.

Mudanças na Biblioteca Padrão

Novas Funções para Manipulação de Time

A biblioteca time recebeu novas funções para facilitar a manipulação de fusos horários (time zones) e horários específicos.

  • time.Parse(layout, value string): Essa função facilita a conversão de strings em valores time.Time com base em um layout específico.
package main

import (
	"fmt"
	"time"
)

func main() {
	dataString := "2023-10-27 10:30:00"
	layout := "2006-01-02 15:04:05" // Layout Go para a data e hora

	dataTime, err := time.Parse(layout, dataString)
	if err != nil {
		fmt.Println("Erro ao fazer o parse:", err)
		return
	}

	fmt.Println("Data e hora:", dataTime)
}

Suporte a TLS 1.3 Aprimorado

O Go 1.15 continuou a fortalecer o suporte a TLS 1.3, o protocolo de segurança mais recente para comunicação criptografada. As melhorias incluem:

  • Desempenho Otimizado: Implementações mais eficientes de algoritmos criptográficos usados em TLS 1.3.
  • Segurança Aprimorada: Correções de bugs e melhorias na segurança para mitigar vulnerabilidades.

O suporte a TLS 1.3 é fundamental para garantir a segurança das comunicações em rede.

Novas Funções na Biblioteca io/fs (Experimental)

A biblioteca io/fs foi introduzida como experimental, oferecendo uma interface abstrata para sistemas de arquivos. Isso permite que o código interaja com diferentes tipos de sistemas de arquivos de forma genérica, sem depender de implementações específicas.

package main

import (
	"fmt"
	"io/fs"
	"os"
)

func main() {
	err := fs.WalkDir(os.DirFS("."), ".", func(path string, d fs.DirEntry, err error) error {
		if err != nil {
			return err
		}
		fmt.Println(path)
		return nil
	})
	if err != nil {
		fmt.Println(err)
	}
}

Este exemplo usa fs.WalkDir para percorrer o sistema de arquivos a partir do diretório atual.

Mudanças na Biblioteca crypto/x509

A biblioteca crypto/x509 teve mudanças significativas para reforçar a segurança. Como mencionado anteriormente, o suporte ao CommonName foi desativado por padrão. Além disso, foram adicionadas novas opções para configurar a validação de certificados.

package main

import (
	"crypto/tls"
	"crypto/x509"
	"fmt"
	"log"
	"net/http"
)

func main() {
	certPool, err := x509.SystemCertPool()
	if err != nil {
		log.Fatalf("Falha ao carregar o sistema de certificados: %v", err)
	}

	tlsConfig := &tls.Config{
		RootCAs: certPool,
	}

	client := &http.Client{
		Transport: &http.Transport{
			TLSClientConfig: tlsConfig,
		},
	}

	resp, err := client.Get("https://example.com")
	if err != nil {
		log.Fatalf("Falha ao fazer a requisição: %v", err)
	}
	defer resp.Body.Close()

	fmt.Println("Requisição bem-sucedida!")
}

Este exemplo demonstra como configurar um cliente HTTP com um pool de certificados raiz para validar certificados TLS.

Melhorias de Performance

Além das melhorias no GC e no linker, o Go 1.15 também introduziu otimizações em outras áreas, resultando em um desempenho geral aprimorado.

  • Otimização de Funções Inline: O compilador agora é mais agressivo na inlining de funções, reduzindo o overhead de chamadas de função.
  • Melhorias na Alocação de Memória: Otimizações na alocação de memória reduziram o overhead e melhoraram a eficiência.

Essas melhorias, embora sutis individualmente, contribuem para um aumento geral no desempenho das aplicações Go.

Gerenciamento de Módulos (Go Modules)

O Go 1.15 continuou a aprimorar o suporte a Go Modules, o sistema de gerenciamento de dependências padrão do Go.

  • Melhorias no Cache de Módulos: O cache de módulos foi otimizado para reduzir o tempo de download e verificação de dependências.
  • Suporte a Módulos Privados: Melhorias foram feitas para suportar o uso de módulos privados em ambientes corporativos.

Go Modules simplifica o gerenciamento de dependências, tornando mais fácil construir e manter projetos Go.

Como Atualizar para o Go 1.15

A atualização para o Go 1.15 é um processo simples. Primeiro, certifique-se de ter o Go instalado corretamente. Em seguida, execute o seguinte comando:

go get golang.org/dl/go1.15
go1.15 download
go1.15 install

Este comando baixará e instalará o Go 1.15. Para usar esta versão, você pode usar o comando go1.15. Para torná-lo o padrão, você pode definir o PATH ou usar go install std.

export PATH=$PATH:$(go env GOROOT)/bin

Verifique a versão instalada:

go version

Certifique-se de que a saída mostre go version go1.15.

Considerações sobre Compatibilidade

Embora o Go seja conhecido por sua forte compatibilidade com versões anteriores, é importante estar ciente de algumas mudanças que podem exigir ajustes no código existente.

  • X.509 Common Name: Se você estiver usando certificados X.509 que dependem do Common Name, precisará migrar para o uso de SANs ou habilitar temporariamente o suporte ao Common Name (não recomendado).
  • Dependências: Verifique se suas dependências são compatíveis com o Go 1.15. Se encontrar problemas, atualize as dependências para as versões mais recentes.

Em geral, a atualização para o Go 1.15 deve ser relativamente simples, mas é sempre bom testar o código após a atualização para garantir que tudo funcione corretamente.

Conclusão

O Go 1.15 representa um passo significativo na evolução da linguagem. As melhorias no garbage collector, linker, segurança e biblioteca padrão tornam o Go uma escolha ainda mais atraente para uma ampla gama de aplicações. Ao atualizar para o Go 1.15, você pode aproveitar esses benefícios e garantir que suas aplicações estejam executando com o máximo de desempenho e segurança. Consulte as release notes oficiais para uma lista completa de mudanças e detalhes adicionais. A adoção desta versão contribui para a construção de software mais robusto e eficiente.