Go 1.16-1.17: A era do lazy loading
Visão geral
Seção intitulada “Visão geral”As versões Go 1.16 e 1.17 marcam um divisor de águas no ecossistema Go, tornando módulos o padrão e introduzindo otimizações na resolução de dependências.
Timeline:
- Go 1.16: Fevereiro 2021
- Go 1.17: Agosto 2021
Go 1.16 (Fevereiro 2021)
Seção intitulada “Go 1.16 (Fevereiro 2021)”Mudança mais importante: módulos agora são o padrão
Seção intitulada “Mudança mais importante: módulos agora são o padrão”# GO111MODULE agora ON por padrão# GOPATH mode descontinuado para novos projetosGO111MODULE=on # Padrão (não precisa mais definir!)Impacto:
- Novos projetos no modo de módulos precisam de
go.mod - O modo GOPATH ainda pode ser selecionado com
GO111MODULE=off - Migração para módulos se tornou urgente
🔄 Comandos de Build Não Modificam go.mod
Seção intitulada “🔄 Comandos de Build Não Modificam go.mod”Mudança de comportamento:
# Go ≤ 1.15go build # Modifica go.mod automaticamente ✏️
# Go ≥ 1.16go 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 explicitamentego get <package>@<version>go mod tidy📦 go install com Versões
Seção intitulada “📦 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 projeto - Versões explícitas
- Isolamento de ferramentas
🚫 Module Retraction
Seção intitulada “🚫 Module Retraction”Marque versões problemáticas como não recomendadas:
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
Seção intitulada “🔒 GOVCS - Controle de VCS”Proteção contra comandos maliciosos:
# Padrão seguroGOVCS="public:git|hg,private:all"
# Apenas GitGOVCS="*:git"📝 Padrão “all” redefinido
Seção intitulada “📝 Padrão “all” redefinido”# Go ≤ 1.15go test all # Testa TUDO, incluindo deps transitivas
# Módulos com go 1.16 ou superiorgo test all # Testa os pacotes do módulo principal e os importados por eles ou seus testesOutras melhorias
Seção intitulada “Outras melhorias”GOMODCACHE, introduzido no Go 1.15, continua permitindo escolher outro local para o cache- Melhorias no vendor
go mod downloadmais robusto
Go 1.17 (Agosto 2021)
Seção intitulada “Go 1.17 (Agosto 2021)”🚀 Lazy Module Loading
Seção intitulada “🚀 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 esperados:
- Menos arquivos
go.modlidos quando os requisitos já atendem ao comando - Menor trabalho de resolução, dependendo do grafo
- Quantidade de checksums também depende da compatibilidade preservada pelo
tidy
Ver capítulo: Lazy Loading
✂️ Module Graph Pruning
Seção intitulada “✂️ 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
Seção intitulada “📋 Dois blocos de require”Agora go.mod separa deps diretas e indiretas:
module example.com/projeto
go 1.17
// Dependências DIRETASrequire ( github.com/gin-gonic/gin v1.9.1 gorm.io/gorm v1.25.7)
// Dependências INDIRETASrequire ( 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
Seção intitulada “🔢 Dependências transitivas explícitas”Módulos com go 1.17 ou superior registram requisitos para os módulos que fornecem pacotes importados direta ou indiretamente pelo código e pelos testes:
# 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
Seção intitulada “📊 go mod graph melhorado”# Ver grafo podadogo mod graph
# Muito menor que antes!🛠️ Mudanças no go get
Seção intitulada “🛠️ Mudanças no go get”# No Go 1.17, usar go get para instalar executáveis foi depreciado.# No Go 1.18, go get passou a apenas alterar dependências.# -d tornou-se desnecessária e foi removida no Go 1.25.
# Use go install para ferramentasgo install golang.org/x/tools/cmd/stringer@latestOutras melhorias
Seção intitulada “Outras melhorias”go runpassa a aceitarpacote@versão, sem alterar o módulo atual- Melhorias no
go mod vendor
Migrando de 1.15 → 1.16 → 1.17
Seção intitulada “Migrando de 1.15 → 1.16 → 1.17”Passo 1: Atualizar para 1.16
Seção intitulada “Passo 1: Atualizar para 1.16”# 1. Baixar Go 1.16# 2. Atualizar go.modgo mod edit -go=1.16
# 3. Mudar workflow# ANTES: go build modificava go.mod# AGORA: Use go mod tidy
go mod tidygo build ./...Passo 2: Atualizar para 1.17
Seção intitulada “Passo 2: Atualizar para 1.17”# 1. Baixar Go 1.17# 2. Atualizar go.modgo mod edit -go=1.17
# 3. Reorganizar requiresgo mod tidy -go=1.17
# 4. Revise os requisitos indiretos adicionados# 5. Revise os checksums preservados por compatibilidadeVerificar mudanças
Seção intitulada “Verificar mudanças”# Ver diff do go.modgit diff go.mod
# Ver diff do go.sumgit diff go.sum | head -50Checklist de atualização
Seção intitulada “Checklist de atualização”Para Go 1.16
Seção intitulada “Para Go 1.16”- Atualizar
goline para1.16 - Remover variável
GO111MODULE(não mais necessária) - Atualizar scripts que dependem de build modificando go.mod
- Mudar
go getparago installpara ferramentas - Adicionar
retractpara versões problemáticas - Configurar
GOVCSse necessário - Testar com o novo padrão “all”
Para Go 1.17
Seção intitulada “Para Go 1.17”- Atualizar
goline para1.17 - Executar
go mod tidy -go=1.17 - Revisar a separação de requisitos diretos e indiretos
- Conferir os checksums necessários por compatibilidade
- Atualizar deps para Go 1.17+ (para máximo pruning)
- Medir o desempenho com as mesmas condições de cache
- Atualizar CI/CD se necessário
Recursos adicionais
Seção intitulada “Recursos adicionais”Resumo: Por que essas versões são importantes?
Seção intitulada “Resumo: Por que essas versões são importantes?”| Feature | Impacto |
|---|---|
| Módulos por padrão (1.16) | Novos projetos usam go.mod |
| 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) | Carregamento do grafo sob demanda |
| Graph pruning (1.17) | ✂️ Menos conflitos |
| Dois blocos require (1.17) | 📋 Mais legível |