Самая частая причина - горутина навсегда блокируется на операции с каналом: ждёт чтения или записи в канал, который никогда не станет готов (никто не пишет/не закроет канал, или все ждут друг друга). Утечка горутины ведёт к утечке памяти (стек, захваченные переменные).
ch := make(chan int)
go func() {
<-ch // навсегда ждёт - никто не пишет
}() // утечка
context с отменой и проверять ctx.Done() в selecttime.After в select или context.WithTimeoutДиагностика: runtime.NumGoroutine(), профиль горутин go tool pprof http://.../debug/pprof/goroutine.