Ответ
Используй context.Context для управления жизненным циклом горутин. Создай контекст с отменой (context.WithCancel) и передай его в горутины. При вызове cancel() все горутины, слушающие этот контекст, завершатся.
Пример:
ctx, cancel := context.WithCancel(context.Background())
go func() {
select {
case <-ctx.Done():
return // завершение по отмене
case <-time.After(5 * time.Second):
fmt.Println("Work done")
}
}()
// Аварийное завершение
cancel()
Для экстренных случаев можно использовать panic(), но это не рекомендуется — лучше управлять завершением через каналы или контекст.