Buenas Prácticas para la Depuración y Escenarios de Defectos
Listas de verificación de prevención y plantillas de RCA para incidentes en Go.
Busca en todas las páginas de la documentación
Listas de verificación de prevención y plantillas de RCA para incidentes en Go.
Estas reglas convierten los puntos débiles recurrentes en hábitos de revisión, puertas de CI y notas post-incidente que evitan que la misma clase de defecto se envíe dos veces.
go test -race, govet y golangci-lint en paquetes que comparten estado mutable.GOTRACEBACK=all y los endpoints de pprof aceleran la causa raíz.-race y paralelismo realista. Los pases locales inestables ocultan carreras de datos que la carga de producción expone.(nil, nil) para "no encontrado" en tipos puntero. Devuelva ErrNotFound o un centinela tipado que los llamadores manejen con errors.Is.err == nil no garantiza *T no nil.error. Devuelva un error nil sin tipo o un valor de error concreto, no (*MyError)(nil) a menos que los llamadores lo esperen.null se desempaqueta a nil sin error.nilaway, staticcheck) en los límites del servicio. Capture las rutas de retorno que los analizadores marcan antes del pánico en tiempo de ejecución.s[low:high:high] o append([]T(nil), s...) cuando los consumidores puedan agregar.len, cap y mutaciones de respaldo al depurar errores de append. La corrupción silenciosa rara vez provoca pánico.sync.Map o bloqueos de fragmentos para cachés.bytes.Buffer.Bytes() como efímeras. Copie si las conserva más allá de la siguiente mutación del búfer.-race cuando los slices o las estructuras se muten desde manejadores y bucles de actualización en segundo plano.r.Context() a través de los manejadores HTTP a todas las E/S bloqueantes. La desconexión del cliente y Shutdown deben detener el trabajo.cancel() desde WithCancel/WithTimeout. defer cancel() inmediatamente después de la creación.select en ctx.Done() para goroutines bloqueadas en canales. Evite fugas cuando los productores nunca envían.v := v o el paso de parámetros sigue siendo defensivo después de Go 1.22.defer dentro de bucles sin una función por iteración. Los defer se apilan hasta la salida de la función y provocan fugas de descriptores de archivo.sync.Once para singletons perezosos, no para inicialización de doble verificación no sincronizada. El detector de carreras valida los caminos de Once de forma económica.ParseInLocation. Los diseños sin zona usan UTC, no la zona del portátil del desarrollador.In(loc) para mostrar. Compare con Equal, no con cadenas formateadas.time/tzdata o instale tzdata en contenedores mínimos. LoadLocation falla silenciosamente en CI si nunca se llama.http.Server.Shutdown. Cancele el contexto raíz cuando llegue la señal.Propagación de contexto, no compartir mapas mutables sin bloqueos, devoluciones de errores explícitas en lugar de (nil, nil), y -race en CI en paquetes de manejadores.
Use A para incidentes, B-D para cambios concurrentes o de analizador, E para cambios de API y despliegue.
Pase completo mensualmente en paquetes activos.
Cada letra se mapea a los artículos de esta sección.
Use la lista para la prevención; use los tutoriales al enseñar pasos de reproducción.
Familia de síntomas, línea de tiempo, evidencia de goroutine/pánico, frame de causa raíz, PR de corrección y guardia (prueba, linter o monitor) que demuestre que la recurrencia se detecta.
Errores de lógica de una sola goroutine y programas de reproducción pequeños.
Pase a Delve y pprof cuando aparezcan problemas de concurrencia, fugas o semántica de interfaz nil.
Se aplican las reglas principales de nil, slice y race.
Algunas bibliotecas estándar (tzdata, partes de reflexión) difieren; verifique los objetivos de la placa según los pines del manifiesto.
Trimestralmente en staging: cargue, detenga el tráfico, confirme que el recuento de goroutines vuelve a la línea de base en cuestión de minutos.
No, los linters atrapan patrones que los revisores pasan por alto.
La revisión atrapa semánticas incorrectas que los linters no pueden modelar.
Ejecute go test -race -count=50 en el paquete inestable.
La mayoría de la inestabilidad en los servicios de Go son carreras o suposiciones de tiempo.
Sí, para los paquetes que mutan estado compartido o generan goroutines en los manejadores.
Los paquetes puros pueden excluirse explícitamente en la configuración de CI.
Versiones de Stack: Esta página fue escrita para Go 1.26.x (predeterminado Green Tea GC, 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: 19 jul 2026