Pular para o conteúdo

Go 1.22-1.25: A era das features modernas

Esta página registra as mudanças até Go 1.25. Para as versões seguintes, veja Go 1.26-1.27: Compatibilidade e manutenção.

Go 1.22-1.25 poliu o sistema de módulos com features modernas focadas em produtividade, segurança e gerenciamento de dependências.

Timeline:

  • Go 1.22: Fevereiro 2024
  • Go 1.23: Agosto 2024
  • Go 1.24: Fevereiro 2025
  • Go 1.25: Agosto 2025

Workspace agora suporta vendoring!

Janela do terminal
# Criar vendor para o workspace que contém service1 e service2
go work vendor
# Build usando vendor
go build -mod=vendor ./service1/... ./service2/...

Em módulos com go 1.22 ou superior, variáveis declaradas pelo loop passam a ter uma instância por iteração:

// Go ≤ 1.21: Bug clássico
for i := range items {
go func() {
fmt.Println(i) // Compartilha a variável do loop
}()
}
// Go ≥ 1.22: Funciona corretamente!
for i := range items {
go func() {
fmt.Println(i) // ✅ Valor correto
}()
}

Janela do terminal
go mod tidy -diff

O comando mostra as alterações necessárias em go.mod e go.sum e retorna status diferente de zero quando há diferenças.


FEATURE MUITO ESPERADA!

Finalmente, gerenciamento oficial de ferramentas:

go.mod
module example.com/project
go 1.25
// Dependências de runtime
require (
github.com/gin-gonic/gin v1.10.0
)
// Ferramentas de desenvolvimento
tool (
golang.org/x/tools/cmd/goimports
github.com/golangci/golangci-lint/cmd/golangci-lint
github.com/swaggo/swag/cmd/swag
)

Comandos:

Janela do terminal
# Adicionar ferramenta
go get -tool github.com/golangci/golangci-lint/cmd/golangci-lint@latest
# Executar ferramenta
go tool golangci-lint run
# Instalar ferramentas
go install tool # Instala todas no GOBIN

Ver capítulo completo: Tool Dependencies

Autenticação para descoberta de módulos via HTTPS e acesso a proxies:

Janela do terminal
# Arquivo ~/.netrc ou o arquivo indicado por NETRC (padrão)
export GOAUTH=netrc
# Credential helper do Git, executado nesse diretório absoluto
export GOAUTH="git /home/gopher/projeto"
# Helper próprio
export GOAUTH="/usr/local/bin/auth-helper"

Os métodos podem ser separados por ;. Configure GOPRIVATE para indicar os módulos privados e a autenticação do próprio Git quando o download usar esse VCS.

Ver capítulo: Security Features


Ignore diretórios ao matching patterns:

go.mod
module example.com/project
go 1.25
// Ignorar diretórios específicos
ignore (
./generated
./examples/legacy
deprecated
)

Uso:

Janela do terminal
# ./... agora ignora os diretórios especificados
go build ./...
go test ./...

Módulos em subdiretórios já eram suportados. A novidade permite indicar esse subdiretório na resposta go-import usada por caminhos personalizados:

<meta name="go-import" content="example.com/lib git https://github.com/org/repo subproject">

Aqui, example.com/lib aponta para o diretório subproject do repositório. O import continua usando o caminho do módulo:

import "example.com/lib"

Novo pattern para workspace modules:

Janela do terminal
# Testa todos os pacotes em TODOS os módulos do workspace
go test work
# Build todos os módulos do workspace
go build work
  • Toolchain não é mais adicionado automaticamente ao atualizar go line
  • Melhor controle de versões

Versão Feature Destaque Categoria
1.22 go work vendor Workflow
1.23 go mod tidy -diff Manutenção do go.mod
1.24 tool directive + GOAUTH Produtividade
1.25 ignore + work pattern Refinamento

module github.com/empresa/api
go 1.25
// Dependências de runtime
require (
github.com/gin-gonic/gin v1.10.0
gorm.io/gorm v1.25.10
)
// Dependências indiretas
require (
github.com/gin-contrib/sse v0.1.0 // indirect
// ...
)
// Ferramentas de desenvolvimento
tool (
golang.org/x/tools/cmd/goimports
github.com/golangci/golangci-lint/cmd/golangci-lint
github.com/swaggo/swag/cmd/swag
)
// Ignorar diretórios
ignore (
./generated
./examples/legacy
)
Janela do terminal
# 1. Setup inicial
go work init ./service1 ./service2
# 2. Baixar deps + ferramentas
go mod download
# 3. Instalar ferramentas
go install tool
# 4. Desenvolvimento
go tool goimports -w .
go tool golangci-lint run
go test work # Testa todos os módulos do workspace
# 5. Build
go build work # Build dos módulos do workspace

Janela do terminal
# 1. Atualizar Go
go install golang.org/dl/go1.25.0@latest
go1.25.0 download
# 2. Atualizar go.mod
go1.25.0 get go@1.25.0
# 3. Migrar ferramentas
go get -tool golang.org/x/tools/cmd/goimports@latest
go get -tool github.com/golangci/golangci-lint/cmd/golangci-lint@latest
# 4. Remover tools.go (se existir)
rm tools.go
# 5. Adicionar ignore se necessário
go mod edit -ignore=./generated -ignore=./examples/legacy
# 6. Tidy
go mod tidy
# 7. Testar
go build ./...
go test work
Janela do terminal
# Para módulos privados, com credenciais já configuradas em ~/.netrc
export GOPRIVATE="github.com/empresa/*"
export GOAUTH=netrc

  • Usar go work vendor se aplicável
  • Conferir a compatibilidade ao mudar a diretiva go
  • Usar go mod tidy -diff para conferir os arquivos
  • Migrar para tool directive
  • Configurar GOAUTH para repos privados
  • Adicionar ignore directive se necessário
  • Usar work pattern em workspaces


Go modules em 2025 é maduro, poderoso e produtivo:

Problema Solução (Go 1.25)
Gerenciar ferramentas ✅ tool directive
Autenticação privada ✅ GOAUTH
Multi-module dev ✅ Workspace mode
Versões do Go ✅ Toolchain management
Performance ✅ Lazy loading + pruning
Segurança ✅ GOVCS + Checksum DB + GOAUTH
Go 1.25
├─ Módulos (modo padrão)
├─ Workspace (multi-module)
├─ Toolchain automático
├─ Tool directive (ferramentas)
├─ GOAUTH (auth moderna)
└─ Lazy loading (performance)