go vet & Diagnósticos Comunes del Analizador
go vet inspecciona el código fuente de Go en busca de construcciones que compilan pero probablemente estén mal.
Busca en todas las páginas de la documentación
go vet inspecciona el código fuente de Go en busca de construcciones que compilan pero probablemente estén mal.
Cada equipo debería ejecutar go vet ./... localmente y en CI, comprender los diagnósticos comunes y saber cuándo los analizadores más profundos añaden valor.
Tarjeta de receta de referencia rápida - lista para copiar y pegar.
# Todos los paquetes del módulo
go vet ./...
# Paquetes específicos
go vet ./internal/...
# Listar analizadores disponibles (Go 1.26+)
go tool vet help
# Ejecutar vet a través del harness de pruebas (algunos equipos lo prefieren)
go test -vet=off ./... # deshabilitar vet durante la prueba cuando se ejecuta por separadoCuándo usar esto:
Controlador con errores:
package api
import (
"encoding/json"
"fmt"
"net/http"
)
type User struct {
Name string `json:name` // sintaxis de etiqueta 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) // discrepancia de verbo de formato
}Ejecutar:
go vet ./...Salida 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 corregido:
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)
}Lo que esto demuestra:
go test.go/analysis).GOOS y GOARCH afectan qué archivos examina vet.| Analizador | Qué marca | Corrección de ejemplo |
|---|---|---|
printf | Verbos de formato vs tipos de argumento | Coincidir %s, %d, %v con los argumentos |
structtag | Etiquetas de struct mal formadas o conflictivas | Corregir las comillas de json:"name" |
unsafeptr | Conversiones inválidas de unsafe.Pointer | Rediseñar código inseguro o añadir pruebas |
copylocks | Copia de structs que contienen locks | Usar receptores de puntero o evitar la copia |
loopclosure | Goroutines que capturan variables de bucle (pie de riesgo pre-1.22) | Pasar parámetro o usar la semántica de Go 1.22+ |
lostcancel | context.WithCancel sin llamada cancel() | defer cancel() |
httpresponse | Cuerpo de http.Response no cerrado en rutas de error | defer resp.Body.Close() con verificación de error |
testinggoroutine | t.Fatal desde una goroutine que no es de prueba | Señalar fallo a través de canal o t.Error + sincronización |
El linter govet de golangci-lint envuelve los analizadores de vet y puede habilitar verificaciones adicionales.
Ejecutar go vet solo es más simple en scripts; golangci-lint centraliza la severidad y las exclusiones.
# Extracto de .golangci.yml
linters:
enable:
- govet
linters-settings:
govet:
enable-all: true// Ejemplo de copylocks - vet marca la copia de sync.Mutex
type Bad struct {
mu sync.Mutex
}
func use(b Bad) { // vet: pasa el lock por valor
b.mu.Lock()
}Prefiere receptores de puntero o no incrustes locks en structs que se copian.
| Necesidad | Usar |
|---|---|
| Código muerto, deprecación de API | staticcheck (SA*) |
| Rutas de desreferenciación de nil | nilaway, staticcheck |
| Olores de seguridad | gosec |
| APIs personalizadas de la organización | plugin go/analysis |
go vet en la rama de actualización temprano.main - Los errores se esconden en internal/. Solución: Siempre go vet ./....copylocks en rutas de acceso rápido - Pasar structs bloqueados copia el estado del mutex. Solución: Usar punteros o rediseñar la API.%v deliberadamente con un comentario.GOFLAGS de CI.//nolint:govet de forma generalizada - Oculta futuros problemas reales. Solución: Reducir las supresiones a una sola línea con un ticket de justificación.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Solo golangci-lint | Necesitas una configuración para más de 30 linters | Quieres cero YAML y scripts rápidos |
| Solo staticcheck | Corrección más profunda, códigos SA | Necesitas verificaciones de la toolchain oficial en CI mínima |
| Solo errores del compilador | Nunca para producción en Go | - |
| Solo pruebas en tiempo de ejecución | Complementa vet | Reemplazar el análisis estático para errores de etiquetas/printf |
No.
Se enfoca en patrones sospechosos de alta confianza.
Las pruebas, el detector de carreras y staticcheck cubren otras lagunas.
El orden es flexible.
Muchos pipelines ejecutan go vet y go test en trabajos paralelos para ahorrar tiempo.
Versiones de Go diferentes, etiquetas de compilación o archivos solo presentes en el checkout de CI.
Alinear la versión de go y las variables de entorno.
Antes de Go 1.22, las variables de bucle se reutilizaban, por lo que las goroutines veían el valor final.
Go 1.22+ crea variables por iteración; aún vale la pena entenderlo para bibliotecas que soportan versiones anteriores de Go.
structtag falla en tiempo de compilación/vet por etiquetas mal formadas.
Los errores de Marshal a menudo aparecen solo en tiempo de ejecución para tipos de campo no soportados.
En golangci-lint, ajusta la configuración de govet.
go vet simple usa el conjunto predeterminado de la toolchain para tu versión de Go.
Sí, cuando analizas paquetes que incluyen pruebas.
Algunos analizadores tienen reglas específicas para pruebas (testinggoroutine).
Sí, si se compila.
Si los generadores emiten ruido de vet conocido, excluye rutas en golangci-lint en lugar de omitir vet por completo.
Herramientas separadas.
go fix aplica reescrituras; go vet informa problemas sin auto-corrección (excepto a través de correcciones rápidas del editor para algunos analizadores).
Sí (analizador unreachable).
A menudo indica un return faltante o ramas muertas después de una refactorización.
Versiones de la Pila: Esta página fue escrita para Go 1.26.x (GC por defecto Green Tea, modernizadores de go fix - verificar parche en la compilación), chi (última - verificar en la compilación), gin (última - verificar en la compilación), echo (última - verificar en la compilación), google.golang.org/grpc (última - verificar en la compilación), sigs.k8s.io/controller-runtime (última - verificar en la compilación), kubebuilder (última - verificar en la compilación), tinygo (última - verificar objetivos de placa en la compilación), wazero (última - verificar en la compilación), y golangci-lint (última - verificar conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 16 jul 2026