← Voltar para o blog

Go 1.12: Novidades e Recursos

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

Novidades do Go 1.12: Uma Análise Detalhada

O Go 1.12, lançado em 25 de fevereiro de 2019, trouxe uma série de melhorias e adições que, embora não revolucionárias, refinaram a linguagem e a tornaram ainda mais robusta e eficiente. Esta versão focou em performance, usabilidade e consistência, solidificando o Go como uma escolha popular para desenvolvimento de software. Este artigo explora as principais novidades e mudanças introduzidas no Go 1.12, fornecendo exemplos práticos e links para a documentação oficial para auxiliar na compreensão e adoção dessas atualizações.

Principais Novidades

O Go 1.12 introduziu diversas melhorias, com foco em performance e adições à biblioteca padrão. Algumas das mudanças mais notáveis incluem otimizações no garbage collector, suporte a TLS 1.3 por padrão e melhorias no tratamento de erros.

TLS 1.3 Habilitado por Padrão

Uma das mudanças mais significativas no Go 1.12 é a habilitação do TLS 1.3 por padrão. O TLS 1.3 oferece melhorias de segurança e performance em relação às versões anteriores, como menor latência no handshake e algoritmos de criptografia mais modernos. Isso significa que aplicações Go que utilizam o pacote crypto/tls agora se beneficiarão automaticamente dessas melhorias sem necessidade de modificações no código.

Para desabilitar o TLS 1.3 e voltar ao comportamento anterior, é possível configurar o campo MaxVersion na estrutura tls.Config:

package main

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

func main() {
	cfg := &tls.Config{
		MinVersion: tls.VersionTLS12, // Desabilita TLS 1.3
		MaxVersion: tls.VersionTLS12,
	}

	srv := &http.Server{
		Addr:      ":8080",
		TLSConfig: cfg,
	}

	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintln(w, "Hello, TLS!")
	})

	log.Fatal(srv.ListenAndServeTLS("server.crt", "server.key"))
}

Neste exemplo, definimos MinVersion e MaxVersion como tls.VersionTLS12, efetivamente desabilitando o TLS 1.3 para este servidor. É importante notar que desabilitar o TLS 1.3 pode reduzir a segurança da sua aplicação e só deve ser feito com um bom motivo.

Documentação relevante: crypto/tls

Diagnóstico de Erros Melhorado com %w

O Go 1.12 introduziu o verbo %w para formatação de strings de erro com o pacote fmt. Este verbo permite encapsular um erro existente dentro de um novo erro, preservando a informação original e facilitando o rastreamento da causa raiz de um problema. Anteriormente, era comum perder informações sobre o erro original ao criar novos erros com fmt.Errorf.

package main

import (
	"fmt"
	"os"
)

func readFile(filename string) error {
	_, err := os.ReadFile(filename)
	if err != nil {
		return fmt.Errorf("falha ao ler o arquivo %s: %w", filename, err)
	}
	return nil
}

func main() {
	err := readFile("nao_existe.txt")
	if err != nil {
		fmt.Println(err)
	}
}

Neste exemplo, se os.ReadFile retornar um erro, o novo erro criado com fmt.Errorf usando %w irá encapsular o erro original. Para acessar o erro original, podemos usar a função errors.Unwrap:

package main

import (
	"errors"
	"fmt"
	"os"
)

func readFile(filename string) error {
	_, err := os.ReadFile(filename)
	if err != nil {
		return fmt.Errorf("falha ao ler o arquivo %s: %w", filename, err)
	}
	return nil
}

func main() {
	err := readFile("nao_existe.txt")
	if err != nil {
		fmt.Println(err)
		unwrappedErr := errors.Unwrap(err)
		if unwrappedErr != nil {
			fmt.Println("Erro original:", unwrappedErr)
		}
	}
}

O uso de %w facilita a criação de logs mais informativos e o debugging de aplicações, permitindo uma análise mais precisa da origem dos erros. A função errors.Is também pode ser usada para verificar se um erro na cadeia de erros é de um tipo específico.

Documentação relevante: fmt, errors

Melhorias no Garbage Collector (GC)

O Go 1.12 introduziu melhorias no garbage collector, resultando em menor latência e uso de CPU durante a coleta de lixo. Essas otimizações são automáticas e não requerem alterações no código da aplicação. As melhorias são resultado de ajustes finos no algoritmo de coleta e na forma como a memória é gerenciada. Embora as melhorias possam variar dependendo da carga de trabalho, muitas aplicações se beneficiaram de uma performance aprimorada.

Para monitorar o desempenho do garbage collector, é possível utilizar as ferramentas de profiling do Go, como pprof.

go tool pprof http://localhost:6060/debug/pprof/heap

Este comando coleta informações sobre o uso de memória da aplicação e permite identificar gargalos relacionados ao garbage collector.

Suporte a Time.Format com Número de Semana ISO

O Go 1.12 adicionou suporte para formatar datas e horários com o número da semana ISO usando as diretivas %U (número da semana do ano, começando com a primeira semana do domingo do ano) e %V (número da semana ISO do ano) no método Time.Format. Isso facilita a exibição de datas no formato ISO 8601, que é amplamente utilizado em diversas aplicações.

package main

import (
	"fmt"
	"time"
)

func main() {
	t := time.Now()
	fmt.Println("Data:", t.Format("2006-01-02"))
	fmt.Println("Semana do ano (domingo):", t.Format("2006-01-02 %U"))
	fmt.Println("Semana ISO do ano:", t.Format("2006-01-02 %V"))
}

Este exemplo demonstra como usar %U e %V para obter o número da semana do ano em diferentes formatos. %U considera a primeira semana do ano como a semana que contém o primeiro domingo, enquanto %V segue o padrão ISO 8601.

Documentação relevante: time

Mudanças na Biblioteca Padrão

Além das principais novidades, o Go 1.12 trouxe diversas mudanças e adições menores à biblioteca padrão, melhorando a funcionalidade e a usabilidade de diversos pacotes.

Pacote net/http: Suporte a Trailers HTTP/2

O pacote net/http recebeu melhorias no suporte a trailers HTTP/2. Trailers são cabeçalhos HTTP enviados após o corpo da mensagem, permitindo que o servidor envie informações adicionais após o envio dos dados principais.

Para utilizar trailers, é necessário registrar os cabeçalhos de trailer esperados no ResponseWriter antes de escrever o corpo da resposta.

package main

import (
	"fmt"
	"log"
	"net/http"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Trailer", "Expires")
		w.Header().Set("Content-Type", "text/plain")

		w.WriteHeader(http.StatusOK)

		fmt.Fprintln(w, "Hello, Trailers!")
		w.Header().Set("Expires", "0") // Adiciona o trailer "Expires"

	})

	log.Fatal(http.ListenAndServe(":8080", nil))
}

Neste exemplo, o servidor define o cabeçalho Trailer para indicar que o trailer Expires será enviado. Após escrever o corpo da resposta, o cabeçalho Expires é definido.

Pacote os/user: Melhorias no Suporte a Usuários e Grupos

O pacote os/user recebeu algumas correções e melhorias no suporte a informações de usuários e grupos em diferentes sistemas operacionais. Essas melhorias visam tornar o pacote mais confiável e consistente em diferentes plataformas.

Outras Melhorias

Além das mudanças mencionadas, o Go 1.12 incluiu diversas outras correções de bugs, melhorias de performance e pequenas adições à biblioteca padrão. É recomendável consultar as notas de lançamento completas para obter uma lista detalhada de todas as mudanças.

Melhorias de Performance

Como mencionado anteriormente, o Go 1.12 introduziu melhorias no garbage collector, resultando em menor latência e uso de CPU. Essas otimizações são automáticas e não requerem alterações no código da aplicação. Além disso, outras otimizações no compilador e na biblioteca padrão contribuíram para um desempenho geral aprimorado.

Embora os ganhos de performance possam variar dependendo da aplicação, muitas aplicações se beneficiaram de uma execução mais rápida e eficiente.

Como Atualizar

Para atualizar para o Go 1.12, siga os seguintes passos:

  1. Baixe a versão mais recente do Go 1.12: Acesse o site oficial do Go (https://go.dev/dl/) e baixe o pacote de instalação adequado para o seu sistema operacional.
  2. Instale o Go 1.12: Siga as instruções de instalação fornecidas no site oficial. Geralmente, isso envolve descompactar o pacote e definir as variáveis de ambiente GOROOT e PATH.
  3. Verifique a instalação: Abra um terminal e execute o comando go version. O resultado deve indicar que você está utilizando o Go 1.12.
  4. Atualize suas dependências: Execute o comando go mod tidy no diretório raiz do seu projeto para atualizar as dependências e remover dependências não utilizadas.
  5. Recompile seus projetos: Recompile seus projetos para aproveitar as melhorias e correções de bugs introduzidas no Go 1.12.
go version
go mod tidy
go build .

Após seguir esses passos, sua aplicação estará utilizando o Go 1.12. É importante testar sua aplicação após a atualização para garantir que não haja problemas de compatibilidade.

Conclusão Prática

O Go 1.12 representa uma evolução incremental da linguagem, com foco em refinamentos e melhorias que beneficiam o desenvolvedor no dia a dia. A habilitação do TLS 1.3 por padrão, o aprimoramento no diagnóstico de erros com %w e as otimizações no garbage collector são exemplos de como o Go continua a evoluir para atender às demandas de aplicações modernas e complexas. A atualização para o Go 1.12 é recomendada para todos os desenvolvedores Go, pois oferece uma experiência de desenvolvimento mais robusta e eficiente. Ao adotar as novas funcionalidades e otimizações, é possível construir aplicações mais seguras, rápidas e fáceis de manter. A documentação oficial e as notas de lançamento fornecem informações detalhadas sobre todas as mudanças e podem auxiliar na migração para esta versão.