1.16-1.17: Lazy Loading Era
Go 1.16 e 1.17 - Era do lazy loading e módulos obrigatórios
Visão geral
As versões Go 1.16 e 1.17 marcam um divisor de águas no ecossistema Go, tornando módulos obrigatórios e introduzindo otimizações revolucionárias de performance.
Timeline:
Go 1.16: Fevereiro 2021
Go 1.17: Agosto 2021
Go 1.16 (Fevereiro 2021)
🎯 Mudança mais importante: módulos agora são obrigatórios
# GO111MODULE agora ON por padrão
# GOPATH mode descontinuado para novos projetos
GO111MODULE=on # Padrão (não precisa mais definir!)Impacto:
Todos os novos projetos devem ter
go.modGOPATH ainda funciona para projetos legados
Migração para módulos se tornou urgente
🔄 Comandos de Build Não Modificam go.mod
Mudança de comportamento:
# Go ≤ 1.15
go build # Modifica go.mod automaticamente ✏️
# Go ≥ 1.16
go build # NÃO modifica go.mod ❌
go test # NÃO modifica go.mod ❌
go run # NÃO modifica go.mod ❌Como adicionar dependências agora:
# Use explicitamente
go get <package>@<version>
go mod tidy📦 go install com Versões
Novo: instalar programas em versões específicas:
# Antes (Go 1.15)
GO111MODULE=on go get github.com/golangci/golangci-lint/cmd/golangci-lint@v1.43.0
# Agora (Go 1.16+)
go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.43.0
# Instala em $GOPATH/bin ou $GOBINBenefícios:
Não polu
go.moddo projetoVersões explícitas
Isolamento de ferramentas
🚫 Module Retraction
Marque versões problemáticas como não recomendadas:
// go.mod
retract (
v1.5.0 // Bug crítico - use v1.5.1+
[v1.2.0, v1.2.3] // Builds quebradas
)Ver capítulo: Module Retraction
🔒 GOVCS - Controle de VCS
Proteção contra comandos maliciosos:
# Padrão seguro
GOVCS="public:git|hg,private:all"
# Apenas Git
GOVCS="*:git"📝 Padrão "all" redefinido
# Go ≤ 1.15
go test all # Testa TUDO, incluindo deps transitivas
# Go ≥ 1.16
go test all # Testa apenas main module + deps diretas🗂️ Embed package
Embute arquivos no binário (não é de módulos, mas importante):
import _ "embed"
//go:embed config.yaml
var configData []byte
//go:embed static/*
var staticFiles embed.FSOutras melhorias
GOMODCACHE separado de GOPATH
Melhorias no vendor
go mod downloadmais robustoPerformance geral melhorada
Go 1.17 (Agosto 2021)
🚀 Lazy Module Loading
Revolução de Performance!
Como funciona:
Carrega grafo de módulos sob demanda
Não carrega tudo upfront
Builds muito mais rápidos
Resultados:
⚡ 50% mais rápido em projetos grandes
💾 Menor consumo de memória
📉 go.sum 50% menor
Ver capítulo: Lazy Loading
✂️ Module Graph Pruning
Poda do Grafo de Dependências:
Go 1.16:
Seu módulo
└─ Dep A
└─ Dep B
└─ Dep C ← Carrega TUDO
Go 1.17+:
Seu módulo
└─ Dep A
└─ Dep B ← Para aqui (pruning)Benefícios:
Menos dependências processadas
Menos conflitos
Grafo mais limpo
📋 Dois blocos de require
Agora go.mod separa deps diretas e indiretas:
module example.com/projeto
go 1.17
// Dependências DIRETAS
require (
github.com/gin-gonic/gin v1.9.1
gorm.io/gorm v1.25.7
)
// Dependências INDIRETAS
require (
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/go-playground/validator/v10 v10.14.0 // indirect
)Vantagens:
Clara distinção
Fácil ver o que você realmente usa
Melhor legibilidade
🔢 Dependências transitivas explícitas
Go 1.17+ lista todas as deps transitivas:
# Go 1.16: go.mod tinha ~10 linhas
# Go 1.17+: go.mod pode ter ~100 linhas
# MAS grafo é podado, então builds são mais rápidos!📊 go mod graph melhorado
go mod graph melhorado# Ver grafo podado
go mod graph
# Muito menor que antes!🛠️ Mudanças no go get
go get# Deprecado em comandos de build
go get -d # Flag -d é padrão e deprecada
# Use go install para ferramentas
go install github.com/tool@latestOutras melhorias
go runaceita múltiplos arquivosMelhorias no
go mod vendorPerformance de compilação melhorada
Suporte a novas arquiteturas (ARM64)
Migrando de 1.15 → 1.16 → 1.17
Passo 1: Atualizar para 1.16
# 1. Baixar Go 1.16
# 2. Atualizar go.mod
go mod edit -go=1.16
# 3. Mudar workflow
# ANTES: go build modificava go.mod
# AGORA: Use go mod tidy
go mod tidy
go build ./...Passo 2: Atualizar para 1.17
# 1. Baixar Go 1.17
# 2. Atualizar go.mod
go mod edit -go=1.17
# 3. Reorganizar requires
go mod tidy -go=1.17
# 4. go.mod agora tem dois blocos!
# 5. go.sum será muito menorVerificar mudanças
# Ver diff do go.mod
git diff go.mod
# Ver diff do go.sum (será grande!)
git diff go.sum | head -50Checklist de atualização
Para Go 1.16
Para Go 1.17
Recursos adicionais
Resumo: Por que essas versões são importantes?
Módulos obrigatórios (1.16)
🎯 Fim da era GOPATH
Build não modifica go.mod (1.16)
🔒 Builds determinísticos
go install @version (1.16)
🛠️ Ferramentas versionadas
Retraction (1.16)
🚫 Marcar versões ruins
Lazy loading (1.17)
⚡ 50% mais rápido
Graph pruning (1.17)
✂️ Menos conflitos
Dois blocos require (1.17)
📋 Mais legível
Go 1.16-1.17 são as versões que tornaram o sistema de módulos maduro e production-ready para todos os casos de uso.
Last updated