O Comando go: Ciclo de Vida de Build, Teste e Módulos
O comando go é o driver unificado do Go para compilar programas, executar testes, gerenciar módulos e aplicar verificações estáticas.
Busque em todas as páginas da documentação
O comando go é o driver unificado do Go para compilar programas, executar testes, gerenciar módulos e aplicar verificações estáticas.
Em vez de expor um binário de compilador separado que você invoca manualmente, o toolchain encapsula o compilador, linker, assembler e proxy de módulos em um único fluxo de trabalho que entende caminhos de importação, tags de build e pins de versão.
Esta página é a âncora conceitual para a seção Go Toolchain.
Noções Básicas do Go Toolchain coleta trechos de comandos executáveis; artigos irmãos cobrem go build, manutenção de módulos, analisadores, tags de build e compilação cruzada.
go transforma árvores de origem e requisitos de go.mod em ações de build em cache, execuções de teste e binários instaláveis através de um pipeline compartilhado de carregamento de pacotes e resolução de dependências.Imagine o comando go como um gerente de projeto sentado acima de três sistemas cooperativos: o toolchain do compilador (compile, link, asm), o sistema de módulos (go.mod, proxies, banco de dados de checksum) e o cache de build no disco.
Você nomeia um padrão de pacote (./..., example.com/app/cmd/server) e o comando carrega os pacotes correspondentes, resolve as importações para versões de módulos, aplica restrições de build (SO, arquitetura, tags customizadas) e, em seguida, agenda o trabalho como um grafo direcionado acíclico de ações.
Cada ação pode compilar um pacote, linkar um binário ou executar um teste.
Saídas bem-sucedidas são armazenadas em GOCACHE para que entradas inalteradas evitem retrabalho.
Módulos respondem a "qual versão deste caminho de importação eu uso?"
Seu go.mod lista diretivas require; o toolchain computa uma lista de build com Seleção de Versão Mínima (MVS), baixa módulos para o cache de módulos (GOMODCACHE) e verifica hashes de arquivos contra go.sum.
Essa separação significa que pacotes são unidades de tempo de compilação, enquanto módulos são unidades de distribuição versionadas.
go build produz um artefato no diretório atual (ou -o).
go run compila para um binário temporário e o executa.
go install coloca um binário em GOBIN ou GOPATH/bin.
go test compila binários de teste (incluindo arquivos _test.go) e os executa, opcionalmente com -race, -cover ou -bench.
Todos esses compartilham a mesma metade frontal de carregamento e compilação; apenas a ação final difere.
Quando você executa go test ./..., o comando percorre a raiz do módulo, expande ./... para todos os pacotes na subárvore e constrói um grafo de importação.
Para cada pacote, ele decide se as fontes mudaram, calculando o hash das entradas (arquivos, flags, versão do toolchain, tags de build).
Hits de cache interrompem o processo; falhas enfileiram ações de compilação e linkagem.
Execuções de teste adicionam outra camada: o linker constrói um main de teste que registra funções Test*, então o comando executa esse binário e transmite os resultados.
Comandos de manutenção de módulos (go mod tidy, go mod download, go mod vendor) operam nos mesmos metadados que o build usa.
tidy adiciona linhas require ausentes e remove as não utilizadas, escaneando importações em seu módulo.
download aquece o cache de módulos sem compilar.
vendor copia as fontes dos módulos para vendor/ para builds offline ou auditados (-mod=vendor).
GOTOOLCHAIN (Go 1.21+) seleciona qual release do Go executa o comando.
Uma linha go.mod como go 1.26 pode acionar o download automático de um toolchain mais novo quando GOTOOLCHAIN=auto (o padrão), mantendo as releases de patch consistentes entre os colegas de equipe.
go test ./...
│
▼
carrega pacotes + aplica tags de build
│
▼
resolve versões de módulos (MVS) ──► verifica go.sum
│
▼
planeja grafo de ações ──► hit GOCACHE? ──sim──► pula compilação
│ │
│ não
│ ▼
│ compila / linka / executa teste
▼
stdout resultados + código de saída
// go.mod fixa expectativas de linguagem/toolchain
module example.com/widget
go 1.26
require golang.org/x/sync v0.10.0| Comando Família | Trabalho Principal | Etapa Típica de CI |
|---|---|---|
go build / go install | Produz binários | Artefato de Release |
go test | Executa testes unitários, de race, de benchmark | Portão Obrigatório |
go vet / go fix | Verificações Estáticas e Reescreve | Estágio de Lint |
go mod tidy | Normaliza dependências | Após PRs de dependência |
go mod vendor | Vende fontes | Builds em ambiente isolado ou com política |
go list -m all | Inspeciona lista de build | Auditoria / Entrada SBOM |
Pipelines de CI geralmente encadeiam go mod download (aquecimento do cache), go test -race ./..., go vet ./... e staticcheck ou golangci-lint para análises mais profundas.
Go 1.26 define o coletor de lixo Green Tea como padrão; faça benchmark antes de alterar GOGC com base em suposições antigas.
Os modernizadores go fix reescrevem padrões legados (por exemplo, capturas antigas de variáveis de loop) antes da revisão humana.
Módulos privados exigem GOPRIVATE e, frequentemente, um proxy de módulo Athens ou Artifactory para que o proxy público nunca veja caminhos internos.
A compilação cruzada define GOOS e GOARCH (ou usa go env -w localmente) para que um nó de CI Linux construa artefatos Darwin ou Windows.
-trimpath e -ldflags "-s -w" encolhem binários e removem caminhos de host de pilhas de pânico, o que é importante para revisões de segurança e imagens de contêiner.
Quando os builds parecem lentos, inspecione a eficácia do cache com go clean -cache apenas como uma etapa de solução de problemas, não um hábito diário.
| Abordagem | Força | Fraqueza | Melhor Ajuste |
|---|---|---|---|
| Cache de Módulos + Proxy | Downloads rápidos e reproduzíveis | Precisa de rede ou cache aquecido | Fluxo de trabalho padrão de código aberto |
| Vendoring | Árvore de origem offline e revisável | Mudanças de merge em atualizações | Ambientes regulamentados ou isolados |
GOTOOLCHAIN=local | Sem busca automática de toolchain | Colegas de equipe com Go antigo quebram builds | Manutenção legada estritamente fixada |
Workspace (go.work) | Desenvolvimento local multi-módulo | Outro arquivo para sincronizar em CI | Monorepos com bibliotecas compartilhadas |
| Cache de build remoto (Bazel/CI) | Compartilhado entre máquinas | Infraestrutura extra | Organizações muito grandes |
go run é para implantações de produção - ele sempre compila primeiro e usa um binário temporário; envie artefatos de go build em vez disso.go get apenas baixa - no modo de módulos, ele também atualiza go.mod e pode atualizar requisitos transitivos.go.sum corrige erros de checksum - geralmente mascara adulteração ou problemas de proxy; investigue a incompatibilidade em vez disso.go test apenas executa testes no diretório atual - padrões como ./... recursam; esquecer isso perde pacotes em subpastas.go.mod - go.mod permanece a autoridade; vendor/ é um snapshot materializado.GOROOT é o SDK Go instalado (compilador, stdlib).
GOPATH é a raiz do workspace legado; o modo de módulos armazena downloads em GOMODCACHE em vez de GOPATH/src.
Binários de go install vão para GOPATH/bin ou GOBIN.
GOCACHE armazena saídas de ações com chaves de entradas.
Pacotes inalterados reutilizam arquivos compilados em vez de recompilar.
Quando importações referenciam módulos não listados em require, ou require listados não são usados.
Execute-o após refatorações que adicionam ou removem importações.
Permite que o comando baixe e use um toolchain mais novo que satisfaça a diretiva go em go.mod.
Defina como local para proibir downloads automáticos.
Ele compila arquivos que terminam em _test.go no mesmo pacote (ou package foo_test para testes externos).
Apenas funções nomeadas TestXxx com a assinatura func TestXxx(t *testing.T) são registradas.
Sim, com um cache de módulos aquecido ou uma árvore vendor/ e builds usando -mod=vendor.
A CI deve fazer vendor ou cache de módulos explicitamente para trabalhos herméticos.
O conjunto de versões de módulos selecionadas para um build após MVS resolver todas as restrições require.
Inspecione com go list -m all.
Sim.
Ele verifica tipos de pacotes usando o mesmo carregador que build e test, e então executa passes de análise.
go.mod declara a intenção; go.sum registra hashes criptográficos do conteúdo do módulo no momento do download.
O toolchain recusa arquivos incompatíveis.
MVS escolhe a versão mínima que satisfaz todos os require.
Você ainda pode usar replace para exceções.
go clean -testcache limpa apenas os resultados de teste.
go clean -cache força recompilações completas e deve ser deliberado, não diário.
Tags filtram quais arquivos são compilados em um pacote.
Testes em arquivos protegidos por tags só rodam quando essas tags são habilitadas com -tags.
Versões de Stack: Esta página foi escrita para Go 1.26.x (Green Tea GC padrão, modernizadores go fix - verificar patch na compilação), chi (última - verificar na compilação), gin (última - verificar na compilação), echo (última - verificar na compilação), google.golang.org/grpc (última - verificar na compilação), sigs.k8s.io/controller-runtime (última - verificar na compilação), kubebuilder (última - verificar na compilação), tinygo (última - verificar alvos de placa na compilação), wazero (última - verificar na compilação) e golangci-lint (última - verificar conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026