← Voltar para o blog

Go 1.10: Novidades e Recursos

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

Novidades do Go 1.10: Um Guia Prático

O Go 1.10, lançado em 16 de fevereiro de 2018, trouxe uma série de melhorias e adições à linguagem, focando em desempenho, ferramentas e bibliotecas. Embora não introduza mudanças drásticas na sintaxe da linguagem, essa versão consolidou o ecossistema Go, preparando o terreno para futuras evoluções. Este artigo explora as principais novidades e como elas podem impactar o desenvolvimento em Go.

Principais Novidades

Suporte a Vendor no Comando go test

Uma das adições mais bem-vindas no Go 1.10 foi o suporte a vendor no comando go test. Anteriormente, ao executar testes em um projeto que utilizava vendor, era necessário tomar cuidado para garantir que as dependências vendidas fossem corretamente resolvidas. O Go 1.10 simplificou esse processo, permitindo que o comando go test reconhecesse automaticamente as dependências vendidas.

Isso significa que, ao executar go test ./... em um projeto com vendor, o Go agora procura pacotes no diretório vendor antes de procurar no GOPATH. Isso garante que os testes utilizem as versões corretas das dependências, evitando conflitos e inconsistências.

Exemplo:

Suponha que você tenha um projeto com a seguinte estrutura:

myproject/
├── main.go
├── mypackage/
│   ├── mypackage.go
│   └── mypackage_test.go
├── vendor/
│   └── github.com/example/dependency/
│       └── dependency.go
└── go.mod

Antes do Go 1.10, executar go test ./... poderia resultar em problemas se a versão da dependência github.com/example/dependency no GOPATH fosse diferente da versão vendida. Agora, o Go 1.10 resolve essa ambiguidade, utilizando a versão vendida para os testes.

Cache de Build Aprimorado

O Go 1.10 introduziu um cache de build mais robusto e eficiente. O cache de build armazena os resultados de compilações anteriores, permitindo que o compilador reutilize esses resultados em compilações subsequentes, economizando tempo e recursos.

A principal melhoria no cache de build do Go 1.10 é a capacidade de armazenar em cache informações sobre arquivos que não foram modificados. Isso significa que, se você modificar apenas um pequeno arquivo em um projeto grande, o compilador poderá reutilizar os resultados da compilação dos outros arquivos, acelerando significativamente o processo de build.

Além disso, o Go 1.10 também otimizou a forma como o cache de build é armazenado e gerenciado, reduzindo o espaço em disco necessário e melhorando o desempenho geral.

Para limpar o cache de build, você pode usar o comando:

go clean -cache

Para desabilitar o cache de build, você pode usar a flag -gcflags=-N -l ao compilar seu código:

go build -gcflags="-N -l" main.go

Suporte a Números Complexos em Templates

O Go 1.10 adicionou suporte para formatação de números complexos em templates. Anteriormente, era necessário converter números complexos para strings antes de exibi-los em templates, o que podia ser complicado e propenso a erros.

Com o Go 1.10, você pode usar as ações {{printf}} e {{.}} para formatar números complexos diretamente em templates. O formato padrão para números complexos é (real+imaginaryi).

Exemplo:

package main

import (
	"os"
	"text/template"
)

func main() {
	tmpl, err := template.New("complex").Parse("Número complexo: {{.}}\n")
	if err != nil {
		panic(err)
	}

	complexNumber := complex(1.2, 3.4)
	err = tmpl.Execute(os.Stdout, complexNumber)
	if err != nil {
		panic(err)
	}
}

A saída deste programa será:

Número complexo: (1.2+3.4i)

Novas Funções na Biblioteca math/rand

A biblioteca math/rand recebeu algumas adições úteis no Go 1.10. Estas funções facilitam a geração de números aleatórios em diferentes cenários.

  • Read(p []byte): Preenche um slice de bytes com números aleatórios. Isso é útil para gerar chaves criptográficas ou outros dados aleatórios.
  • Shuffle(n int, swap func(i, j int)): Embaralha aleatoriamente uma sequência de elementos, utilizando uma função de troca fornecida pelo usuário. Isso é útil para embaralhar listas ou arrays.

Exemplo de Read:

package main

import (
	"fmt"
	"math/rand"
)

func main() {
	b := make([]byte, 10)
	_, err := rand.Read(b)
	if err != nil {
		panic(err)
	}
	fmt.Printf("%x\n", b)
}

Este código gera 10 bytes aleatórios e os imprime em formato hexadecimal.

Exemplo de Shuffle:

package main

import (
	"fmt"
	"math/rand"
)

func main() {
	s := []string{"a", "b", "c", "d", "e"}
	rand.Shuffle(len(s), func(i, j int) {
		s[i], s[j] = s[j], s[i]
	})
	fmt.Println(s)
}

Este código embaralha a lista de strings s aleatoriamente. A saída pode variar a cada execução.

Pequenas Melhorias no Compilador e Linker

Embora o Go 1.10 não tenha introduzido grandes mudanças no compilador e linker, houve algumas pequenas melhorias que contribuíram para um melhor desempenho e estabilidade.

  • Otimizações de código: O compilador foi aprimorado para gerar código mais eficiente em determinadas situações, resultando em programas mais rápidos e com menor consumo de recursos.
  • Melhorias no tratamento de erros: O compilador e linker foram atualizados para fornecer mensagens de erro mais claras e informativas, facilitando a identificação e correção de problemas no código.
  • Redução do tamanho do binário: Foram feitas otimizações para reduzir o tamanho dos binários gerados pelo compilador, o que pode ser importante para aplicações embarcadas ou com restrições de espaço.

Melhorias de Performance

O Go 1.10 continuou a tradição de melhorar o desempenho da linguagem. As principais melhorias de performance nesta versão incluem:

  • Melhorias no Garbage Collector (GC): O GC foi aprimorado para reduzir a latência e o consumo de memória, resultando em programas mais responsivos e eficientes.
  • Otimizações no compilador: O compilador foi otimizado para gerar código mais rápido e eficiente em diversas situações.
  • Melhorias na biblioteca padrão: Diversas funções e pacotes na biblioteca padrão foram otimizados para melhorar o desempenho.

Embora as melhorias de performance no Go 1.10 possam não ser tão drásticas quanto em algumas versões anteriores, elas ainda são significativas e podem fazer uma diferença notável em aplicações com alta demanda de desempenho.

Mudanças na Biblioteca Padrão

Além das novas funções na biblioteca math/rand, o Go 1.10 trouxe outras mudanças e adições na biblioteca padrão. Algumas das mudanças mais notáveis incluem:

  • Novas funções na biblioteca net/http: A biblioteca net/http recebeu algumas novas funções e recursos, como suporte para HTTP Trailers e melhorias no tratamento de cookies.
  • Melhorias na biblioteca encoding/json: A biblioteca encoding/json foi aprimorada para lidar com tipos de dados mais complexos e para fornecer mensagens de erro mais informativas.
  • Adição da biblioteca runtime/trace: A biblioteca runtime/trace permite instrumentar o código para coletar informações de rastreamento, auxiliando na análise de desempenho e na identificação de gargalos.

Consulte a documentação oficial para obter uma lista completa de todas as mudanças na biblioteca padrão: https://go.dev/doc/go1.10

Como Atualizar

A atualização para o Go 1.10 é um processo simples e direto. A maneira mais comum de atualizar é utilizando o comando go get:

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

Após a instalação, você pode usar o comando go1.10 para compilar e executar seus programas com o Go 1.10. Para tornar o Go 1.10 a versão padrão do Go, você pode usar o comando:

go1.10 use

Isso atualizará o link simbólico go para apontar para o Go 1.10.

Alternativamente, você pode baixar os binários pré-compilados para sua plataforma no site oficial do Go: https://go.dev/dl/

Conclusão Prática

O Go 1.10 representou uma evolução importante na linguagem Go, consolidando recursos existentes e introduzindo melhorias que impactam diretamente a produtividade e o desempenho. O suporte a vendor no go test, o cache de build aprimorado e as novas funções nas bibliotecas padrão são adições valiosas para qualquer desenvolvedor Go.

Embora não tenha introduzido mudanças radicais na sintaxe da linguagem, o Go 1.10 demonstrou o compromisso da equipe Go em refinar e otimizar a experiência de desenvolvimento, preparando o terreno para futuras inovações. A atualização para o Go 1.10 é altamente recomendada para todos os desenvolvedores Go, pois oferece uma série de benefícios que podem melhorar significativamente a eficiência e a qualidade do seu trabalho.

Ao entender e aproveitar as novidades do Go 1.10, você estará melhor equipado para construir aplicações robustas, eficientes e escaláveis, aproveitando ao máximo o poder e a flexibilidade da linguagem Go.