1.18-1.21: Workspace & Toolchain Era

Go 1.18-1.21 - Era do Workspace e Toolchain Management

Visão Geral

Go 1.18-1.21 trouxeram Generics (não relacionado a módulos) e features revolucionárias de desenvolvimento multi-módulo e gerenciamento de toolchains.

Timeline:

  • Go 1.18: Março 2022 (Generics + Workspaces)

  • Go 1.19: Agosto 2022

  • Go 1.20: Fevereiro 2023

  • Go 1.21: Agosto 2023 (Toolchain Management)


Go 1.18 (Março 2022)

🎯 Workspace Mode

Maior feature para módulos!

Trabalhe com múltiplos módulos simultaneamente sem replace hacks.

# Antes: Precisava de replace no go.mod
replace github.com/empresa/lib => ../lib

# Agora: Workspace!
go work init ./app ./lib

Arquivo go.work:

go 1.18

use (
    ./app
    ./library
    ./tools
)

Benefícios:

  • ✅ Desenvolvimento local simplificado

  • ✅ Monorepos mais fáceis

  • ✅ Sem editar go.mod

  • ✅ Cada desenvolvedor tem seu workspace local

Ver capítulo completo: Workspace Mode

🔨 Comandos de Workspace

go work init <dirs...>     # Criar workspace
go work use <dir>          # Adicionar módulo
go work use -r .           # Adicionar recursivamente
go work edit               # Editar go.work
go work sync               # Sincronizar deps

🧬 Generics (Não é de módulos, mas revolucionário)

func Min[T constraints.Ordered](a, b T) T {
    if a < b {
        return a
    }
    return b
}

Outras melhorias

  • Fuzzing nativo

  • Performance de compilação melhorada

  • go mod init mais inteligente


Go 1.19 (Agosto 2022)

📝 go.mod doc comments

Agora go.mod suporta comentários de documentação:

// Package mymodule provides awesome functionality.
//
// For more information, see https://example.com/docs
module example.com/mymodule

go 1.19

// Production dependencies
require (
    github.com/gin-gonic/gin v1.9.1
)

🔧 Melhorias no Workspace

  • go work vendor (experimental)

  • Melhor integração com IDEs

  • Performance otimizada

🎯 GODEBUG para forward compatibility

Permite controlar comportamento entre versões:

GODEBUG=http2client=0 go run main.go

Outras melhorias

  • Melhorias de segurança

  • Redução de alocações

  • Suporte a novas plataformas


Go 1.20 (Fevereiro 2023)

🗑️ GO111MODULE removido

# Não existe mais!
# GO111MODULE=off  # ERRO
# GO111MODULE=auto # ERRO

# Módulos são SEMPRE obrigatórios

🚀 PGO (Profile-Guided Optimization) Preview

Otimizações baseadas em profiling:

go build -pgo=default
# 3-5% mais rápido em produção!

🔄 go.work vendor melhorado

# Criar vendor para workspace
go work vendor

Outras melhorias

  • Melhores mensagens de erro.

  • Performance de compilação.

  • Suporte melhorado a CGO.


Go 1.21 (Agosto 2023)

🎯 Gestão automática da Toolchain

FEATURE REVOLUCIONÁRIA!

Go agora baixa automaticamente a versão correta:

// go.mod
go 1.21
toolchain go1.21.5
# Você tem Go 1.20
$ go build
go: downloading go1.21.5 (linux/amd64)
# Usa Go 1.21.5 automaticamente!

Variável GOTOOLCHAIN:

GOTOOLCHAIN=auto     # Padrão: download automático
GOTOOLCHAIN=local    # Usar apenas versão instalada
GOTOOLCHAIN=go1.21.5 # Forçar versão específica

Ver capítulo completo: Toolchain Management

🔧 Diretiva toolchain

module example.com/project

go 1.21
toolchain go1.21.5  // Versão recomendada

require (
    github.com/gin-gonic/gin v1.10.0
)

📦 Toolchains como módulos

Toolchains são tratados como módulos:

  • Caminho: golang.org/toolchain

  • Respeita GOPROXY

  • Cacheable

🔄 Min Version Selection para toolchains

MVS agora se aplica a toolchains também!

🎯 go.mod go Line é Obrigatória

Versões antigas (Go 1.19.13+, 1.20.8+) recusam carregar módulos com go line mais nova.

Outras melhorias

  • Melhorias no for loop (sem capture issues)

  • min() e max() built-ins

  • clear() built-in

  • Performance geral melhorada

  • PGO estável (não mais preview)


Comparação de features

Versão
Feature Principal
Impacto

1.18

Workspace Mode

🎯 Multi-module dev

1.19

Doc comments

📝 Melhor docs

1.20

GO111MODULE removido

🗑️ Limpeza

1.21

Toolchain Management

🚀 Auto-download


Workflow moderno (Go 1.21+)

Desenvolvimento Local

# 1. Criar workspace para múltiplos módulos
go work init ./service1 ./service2 ./shared

# 2. Toolchain automático garante versão correta
# (Definido em go.mod de cada módulo)

# 3. Desenvolver normalmente
cd service1
go build  # Usa workspace + toolchain correto

CI/CD

- uses: actions/setup-go@v5
  with:
    go-version-file: 'go.mod'  # Lê go e toolchain!

# Go baixa toolchain automaticamente se necessário
- run: go build ./...
- run: go test ./...

Migração para Go 1.21+

Preparação

# 1. Atualizar Go para 1.21+
# 2. Atualizar go.mod
go mod edit -go=1.21

# 3. Adicionar toolchain (opcional mas recomendado)
go mod edit -toolchain=go1.21.5

# 4. Tidy
go mod tidy

# 5. Testar
go build ./...
go test ./...

Setup do Workspace

# Para projetos multi-módulo
go work init ./module1 ./module2

# Adicionar ao .gitignore
echo "go.work" >> .gitignore
echo "go.work.sum" >> .gitignore

Checklist de atualização

Go 1.18

Go 1.19-1.20

Go 1.21


Recursos adicionais


Resumo

As versões 1.18-1.21 transformaram o workflow de desenvolvimento:

Feature
Problema Resolvido

Workspace

Desenvolvimento multi-módulo era difícil

Toolchain

Versões do Go eram confusas

PGO

Performance poderia ser melhor

Generics

Type safety sem interfaces vazias

Last updated