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.mod

  • GOPATH 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 $GOBIN

Benefícios:

  • Não polu go.mod do projeto

  • Versõ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.FS

Outras melhorias

  • GOMODCACHE separado de GOPATH

  • Melhorias no vendor

  • go mod download mais robusto

  • Performance 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

# Ver grafo podado
go mod graph

# Muito menor que antes!

🛠️ Mudanças no 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@latest

Outras melhorias

  • go run aceita múltiplos arquivos

  • Melhorias no go mod vendor

  • Performance 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 menor

Verificar mudanças

# Ver diff do go.mod
git diff go.mod

# Ver diff do go.sum (será grande!)
git diff go.sum | head -50

Checklist de atualização

Para Go 1.16

Para Go 1.17


Recursos adicionais


Resumo: Por que essas versões são importantes?

Feature
Impacto

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

Last updated