go vet & Diagnósticos Comuns de Analisadores
go vet inspeciona o código Go em busca de construções que compilam, mas provavelmente estão erradas.
Busque em todas as páginas da documentação
go vet inspeciona o código Go em busca de construções que compilam, mas provavelmente estão erradas.
Toda equipe deve executar go vet ./... localmente e na CI, entender os diagnósticos comuns e saber quando analisadores mais profundos agregam valor.
Cartão de receita de referência rápida - pronto para copiar e colar.
# Todos os pacotes no módulo
go vet ./...
# Pacotes específicos
go vet ./internal/...
# Listar analisadores disponíveis (Go 1.26+)
go tool vet help
# Executar vet via test harness (algumas equipes preferem)
go test -vet=off ./... # desabilitar vet durante o teste ao executar separadamenteQuando usar isso:
Handler com bug:
package api
import (
"encoding/json"
"fmt"
"net/http"
)
type User struct {
Name string `json:name` // sintaxe de tag inválida
}
func Handler(w http.ResponseWriter, r *http.Request) {
u := User{Name: "ada"}
_ = json.NewEncoder(w).Encode(u)
fmt.Printf("user %d", u.Name) // incompatibilidade de verbo de formato
}Executar:
go vet ./...Saída típica:
api/handler.go:12:2: fmt.Printf format %d has arg u.Name of wrong type string
api/handler.go:8:5: struct field tag `json:name` not compatible with reflect.StructTag.Get: bad syntax for struct tag pairCódigo corrigido:
type User struct {
Name string `json:"name"`
}
func Handler(w http.ResponseWriter, r *http.Request) {
u := User{Name: "ada"}
_ = json.NewEncoder(w).Encode(u)
fmt.Printf("user %s", u.Name)
}O que isso demonstra:
go test.go/analysis).GOOS e GOARCH afetam quais arquivos o vet examina.| Analisador | O que sinaliza | Correção de exemplo |
|---|---|---|
printf | Verbos de formato vs tipos de argumento | Corresponder %s, %d, %v aos argumentos |
structtag | Tags de struct malformadas ou conflitantes | Corrigir as aspas de json:"name" |
unsafeptr | Conversões unsafe.Pointer inválidas | Redesenhar código unsafe ou adicionar testes |
copylocks | Copiando structs contendo locks | Usar receptores de ponteiro ou evitar cópia |
loopclosure | Goroutine captura variáveis de loop (footgun pré-1.22) | Passar parâmetro ou usar semântica Go 1.22+ |
lostcancel | context.WithCancel sem chamada cancel() | defer cancel() |
httpresponse | Corpo http.Response não fechado em caminhos de erro | defer resp.Body.Close() com verificação de erro |
testinggoroutine | t.Fatal de goroutine não de teste | Sinalizar falha via canal ou t.Error + sync |
O linter govet do golangci-lint envolve os analisadores vet e pode habilitar verificações adicionais.
Executar go vet sozinho é mais simples em scripts; golangci-lint centraliza severidade e exclusões.
# Trecho de .golangci.yml
linters:
enable:
- govet
linters-settings:
govet:
enable-all: true// Exemplo de copylocks - vet sinaliza a cópia de sync.Mutex
type Bad struct {
mu sync.Mutex
}
func use(b Bad) { // vet: passa o lock por valor
b.mu.Lock()
}Prefira receptores de ponteiro ou não incorpore locks em structs copiadas.
| Necessidade | Use |
|---|---|
| Código morto, depreciação de API | staticcheck (SA*) |
| Caminhos de desreferência nula | nilaway, staticcheck |
| Cheiros de segurança | gosec |
| APIs personalizadas da organização | plugin go/analysis |
go vet no branch de atualização cedo.main - Bugs se escondem em internal/. Correção: Sempre go vet ./....copylocks em caminhos de alta performance - Passar structs com locks copia o estado do mutex. Correção: Use ponteiros ou redesenhe a API.%v deliberadamente com um comentário.GOFLAGS da CI.//nolint:govet amplamente - Esconde futuros problemas reais. Correção: Restrinja as supressões a uma única linha com um ticket de justificativa.| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Apenas golangci-lint | Precisa de uma configuração para mais de 30 linters | Você quer zero YAML e scripts rápidos |
| Apenas staticcheck | Correção mais profunda, códigos SA | Você precisa de verificações da toolchain oficial em CI mínima |
| Apenas erros do compilador | Nunca para produção Go | - |
| Apenas testes de tempo de execução | Complementa vet | Substituir análise estática para bugs de tag/printf |
Não.
Ele visa padrões suspeitos de alta confiança.
Testes, detector de race e staticcheck preenchem outras lacunas.
A ordem é flexível.
Muitos pipelines executam go vet e go test em jobs paralelos para economizar tempo.
Versões diferentes do Go, tags de build ou arquivos presentes apenas no checkout da CI.
Alinhe a versão do go e as variáveis de ambiente.
Antes do Go 1.22, as variáveis de loop eram reutilizadas, então as goroutines viam o valor final.
O Go 1.22+ cria variáveis por iteração; ainda vale a pena entender para bibliotecas que suportam versões mais antigas do Go.
structtag falha no tempo de compilação/vet por tags malformadas.
Erros de Marshal geralmente aparecem apenas em tempo de execução para tipos de campo não suportados.
No golangci-lint, ajuste as configurações do govet.
O go vet puro usa o conjunto padrão da toolchain para sua versão do Go.
Sim, quando você executa vet em pacotes que incluem testes.
Alguns analisadores têm regras específicas para testes (testinggoroutine).
Sim, se for compilado.
Se geradores emitirem ruído vet conhecido, exclua caminhos no golangci-lint em vez de pular o vet inteiramente.
Ferramentas separadas.
go fix aplica reescritas; go vet relata problemas sem correção automática (exceto via correções rápidas do editor para alguns analisadores).
Sim (analisador unreachable).
Frequentemente indica um return ausente ou branches mortos após refatoração.
Versões da Stack: Esta página foi escrita para Go 1.26.x (GC padrão Green Tea, go fix modernizadores - verifique o patch na compilação), chi (última versão - verifique na compilação), gin (última versão - verifique na compilação), echo (última versão - verifique na compilação), google.golang.org/grpc (última versão - verifique na compilação), sigs.k8s.io/controller-runtime (última versão - verifique na compilação), kubebuilder (última versão - verifique na compilação), tinygo (última versão - verifique os alvos de placa na compilação), wazero (última versão - verifique na compilação) e golangci-lint (última versão - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026