Skill de Revisión de Diseño de API Go
Convenciones de manejadores, errores y contexto para revisión automatizada: una Skill de Agente estilo manual para auditar manejadores HTTP y gRPC de Go 1.26 sin correcciones automáticas inseguras.
Busca en todas las páginas de la documentación
Convenciones de manejadores, errores y contexto para revisión automatizada: una Skill de Agente estilo manual para auditar manejadores HTTP y gRPC de Go 1.26 sin correcciones automáticas inseguras.
Produce una lista de verificación de revisión estructurada para manejadores: propagación de context, mapeo de errores, códigos de estado, validación de solicitudes, orden de middleware y forma de respuesta, cada hallazgo vinculado a referencias de archivo y línea.
| Entrada | Por qué |
|---|---|
go.mod | Ruta del módulo, directiva de versión de Go |
| Paquetes afectados | Alcance de go test y lint |
| Elección del enrutador | ServeMux de stdlib vs chi/gin/echo por ADR |
| ADR de manejo de errores | Errores tipados vs patrón centinela |
| ADR de autenticación/registro | Expectativas de middleware |
| OpenAPI o tabla de rutas | Métodos y rutas esperados |
archivo:líneago test ./pkg/..., golangci-lint run ./pkg/...r.Context() a todas las E/S salientes: DB, cliente HTTP, gRPC.apierr dedicado, no ambos.errcheck, contextcheck) sin excepción ADR.Tarjeta de referencia rápida - lista para copiar y pegar.
// Objetivos de revisión (manejador stdlib)
func getUser(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() // debe fluir a store.GetUser(ctx, id)
id := r.PathValue("id")
if id == "" {
writeError(w, apierr.BadRequest("falta id"))
return
}
u, err := store.GetUser(ctx, id)
if err != nil {
writeError(w, mapStoreErr(err))
return
}
writeJSON(w, http.StatusOK, u)
}# Verificación después de las correcciones de revisión
go test ./internal/api/...
golangci-lint run ./internal/api/...
go vet ./internal/api/...Cuándo usar esta skill:
go list ./internal/api/...
grep -r "ServeHTTP\|HandleFunc\|chi\|gin\." internal/api/| Señal | Acción |
|---|---|
Falta r.Context() en db.Query | Bloqueador |
http.Error(w, err.Error(), 500) en validación | Bloqueador |
El manejador llama a log.Printf y devuelve texto de error | Bloqueador |
Mezcla de fmt.Errorf y centinela en el mismo paquete | Advertencia |
Verificar que cada llamada saliente reciba ctx derivado de r.Context():
// MAL: context.Background() en el manejador
user, err := repo.Find(context.Background(), id)
// BIEN: contexto con ámbito de solicitud
user, err := repo.Find(r.Context(), id)ReadHeaderTimeout, WriteTimeout) cancelan r.Context() - el downstream debe respetarlofunc mapStoreErr(err error) apierr.Response {
if errors.Is(err, store.ErrNotFound) {
return apierr.NotFound("usuario")
}
if errors.Is(err, store.ErrInvalid) {
return apierr.BadRequest("id de usuario inválido")
}
return apierr.Internal("fallo al buscar usuario") // opaco para el cliente
}codes.InvalidArgument, codes.NotFound - ver patrones grpc-Go en secciones hermanas| Condición | Estado | Cuerpo |
|---|---|---|
| Fallo de validación | 400 o 422 | { "error": "...", "code": "..." } |
| Fallo de autenticación | 401 / 403 | Sin detalles internos |
| Éxito | 200 / 201 | Recurso o lista según OpenAPI |
| Fallo de servidor desconocido | 500 | ID opaco + registro del lado del servidor |
go test ./internal/api/... -count=1
golangci-lint run ./internal/api/...El orden del middleware afecta los hallazgos de la revisión.
El middleware de registro y de ID de solicitud debe envolver la autenticación, que envuelve los manejadores de negocio.
La recuperación de pánicos pertenece más externamente.
Los agentes a menudo insertan la autenticación después de los manejadores en los borradores; marcar como bloqueador.
La validación pertenece en el límite: parámetros de ruta, consulta, cuerpo JSON.
Usar encoding/json con decodificación estricta (DisallowUnknownFields) cuando el ADR lo requiera.
Para chi/gin, confirmar que la extracción de parámetros coincide con los patrones de ruta registrados.
Idempotencia y métodos: GET y HEAD no deben mutar el estado.
La política de POST para crear vs PUT para actualizar debe coincidir con OpenAPI.
ServeMux de Go 1.22+ con patrones de métodos (GET /users/{id}) evita manejadores accidentales para todos los métodos.
http.Error con err.Error(): filtra detalles de implementación y a menudo usa un estado incorrecto.context.WithTimeout anidado sin defer cancel(): los linters detectan algunos; revisar manualmente.WriteHeader: el estado se bloquea en la primera escritura; usar un ayudante que establezca las cabeceras una vez.http.Client predeterminado no tiene tiempo de espera: marcar llamadas salientes desde manejadores que usan http.DefaultClient.| Enfoque | Cuándo |
|---|---|
| Solo revisión de diseño humana | Equipos pequeños, bajo tráfico |
| OPA / policy-as-code | Estándares HTTP para toda la organización |
| Linter OpenAPI en CI | APIs de contrato primero |
| Esta skill | Revisión de PR asistida con alineación ADR del equipo |
No. Solo la lista de verificación de salida y las sugerencias de diff. El humano fusiona después de que pasen go test y el lint.
Sí, para contexto, mapeo de estado (codes.*) y envoltura de errores. Las secciones específicas de HTTP omiten paquetes solo de gRPC; recopilar entradas de enrutador/proto primero.
Recopilar el framework en las entradas. Revisar gin.HandlerFunc para la propagación de c.Request.Context() y un ayudante centralizado c.JSON para errores.
Versiones de Stack: Esta página fue escrita para Go 1.26.x (predeterminado GC Green Tea, go fix modernizers - verificar parche en la compilación), chi (última versión - verificar en la compilación), gin (última versión - verificar en la compilación), echo (última versión - verificar en la compilación), google.golang.org/grpc (última versión - verificar en la compilación), sigs.k8s.io/controller-runtime (última versión - verificar en la compilación), kubebuilder (última versión - verificar en la compilación), tinygo (última versión - verificar objetivos de placa en la compilación), wazero (última versión - verificar en la compilación) y golangci-lint (última versión - verificar conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 16 jul 2026