Desarrollador Go: pregunta de entrevista
¿Cómo evitas fugas de goroutines?
Una fuga de goroutine ocurre cuando una goroutine queda bloqueada para siempre en E/S, un channel, un lock o un timer. Dale cancelación, trabajo acotado y un propietario que espere el cierre.
Respuesta directa
Qué debe cubrir una buena respuesta
Cómo funciona
Una goroutine se fuga cuando nada la desbloqueará jamás: un receive de un channel que nadie cierra, un send a un channel lleno sin lector, o un lock retenido por una goroutine que ya terminó. La prevención es estructural: cada goroutine necesita un dueño que decida cuándo termina, una señal de cancelación sobre la que hacer select y trabajo acotado para no correr para siempre. Las fugas se ven como un contador de goroutines que crece y memoria que el recolector no puede liberar.
Ejemplo
Pasa context.Context al trabajo de la solicitud y selecciona ctx.Done(); usa WaitGroup para hacer visible la propiedad del ciclo de vida. En un fan-out que consulta tres backends, un channel de resultados con buffer del tamaño del número de workers permite que los rezagados terminen de enviar aunque el llamador ya haya devuelto la primera respuesta.
Errores frecuentes
- Lanzar una goroutine con go func() sin forma de detenerla.
- Enviar por un channel sin buffer después de que el receptor haya desistido.
- Ignorar runtime.NumGoroutine en pruebas que ejercitan rutas de cancelación.
Una estructura útil para responder
Responde desde tu propia experiencia.
No memorices un guion: usa solo ejemplos que puedas explicar con honestidad en preguntas posteriores.
Abre el espacio de trabajo de escritorio y ensaya una respuesta clara con tus propias palabras.