Code review en Go: qué revisar y cómo dar retroalimentación
\nEl code review (revisión de código) no es solo una verificación formal antes de fusionar un pull request. Es una herramienta poderosa para mejorar la calidad del código, compartir conocimientos en el equipo y prevenir errores en etapas tempranas. Para los desarrolladores principiantes de Go, participar en una revisión puede parecer estresante: da miedo recibir observaciones o, por el contrario, pasar por alto un error crítico. En este artículo, analizaremos en qué aspectos fijarse al revisar código Go y cómo dar retroalimentación para que sea útil, no ofensiva.
\n\n¿Por qué es importante el code review especialmente en Go?
\nEl lenguaje Go fue creado con énfasis en la simplicidad, legibilidad y confiabilidad. Sin embargo, la simplicidad de la sintaxis no elimina la complejidad de la lógica. Los problemas típicos en proyectos Go incluyen: ignorar errores, manejo incorrecto de gorutinas y fugas de recursos. Un buen code review ayuda a identificar estos y otros problemas antes de que lleguen a producción.
\n\nQué revisar en código Go: lista de verificación para principiantes
\nPara que la revisión sea sistemática, use una lista de verificación. Estos son los puntos principales que debe revisar en cada pull request.
\n\n1. Manejo de errores (error handling)
\nEn Go, los errores son valores, no se pueden ignorar. Verifique que cada función que devuelve error lo maneje o lo pase explícitamente hacia arriba.
// Mal: ignoramos el error\nfile, _ := os.Open("config.yaml")\n\n// Bien: manejamos el error\nfile, err := os.Open("config.yaml")\nif err != nil {\n log.Fatalf("cannot open config: %v", err)\n}\ndefer file.Close()\nTambién verifique que los errores se envuelvan con fmt.Errorf("...: %w", err) para transmitir contexto, y no solo se registren y se ignoren.
2. Nomenclatura y legibilidad
\nEn Go se usan nombres cortos para variables (por ejemplo, r para reader, w para writer) y nombres largos para funciones exportadas. Verifique que:
- \n
- Las funciones, tipos y variables exportadas tengan comentarios (que comiencen con el nombre de la entidad). \n
- Los nombres de variables reflejen su propósito (no
a,b,tmp). \n - No haya abreviaturas innecesarias (
calces mejor reemplazarlo porcalculate). \n
3. Trabajo con gorutinas y concurrencia
\nLas gorutinas son una herramienta poderosa pero peligrosa. Verifique:
\n- \n
- Si existe un mecanismo de sincronización (canales, mutex) para datos compartidos. \n
- Que no se creen gorutinas "fugitivas" (goroutine leak). Use contexto (
context.Context) para cancelación. \n - Que la gorutina no se bloquee para siempre (deadlock). \n
// Ejemplo de trabajo seguro con gorutina\nfunc worker(ctx context.Context, jobs <-chan int, results chan<- int) {\n for {\n select {\n case job, ok := <-jobs:\n if !ok {\n return\n }\n results <- job * 2\n case <-ctx.Done():\n return\n }\n }\n}\n\n4. Gestión de recursos (defer)
\nVerifique que todos los archivos abiertos, conexiones de red, transacciones de BD se cierren mediante defer. Esto debe hacerse inmediatamente después de abrir el recurso con éxito.
// Correcto: cerramos inmediatamente\nconn, err := net.Dial("tcp", "example.com:80")\nif err != nil {\n return err\n}\ndefer conn.Close()\n\n5. Pruebas
\nLos principiantes a menudo olvidan las pruebas. Asegúrese de que se hayan escrito pruebas unitarias para la nueva lógica. Verifique:
\n- \n
- Las pruebas cubren no solo el camino feliz (happy path), sino también los casos límite. \n
- Si se usa
t.Runpara subpruebas. \n - Que no haya pruebas que dependan de recursos externos (BD, red) sin mocks. \n
Cómo dar retroalimentación: 5 reglas para principiantes
\nLa parte técnica es la mitad del trabajo. La otra mitad es la habilidad de comunicarse. Aquí e