Ответ
Используйте контекст (context.Context) для отмены долгих операций и таймауты. Пример:
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
go func() {
select {
case <-ctx.Done():
fmt.Println("Timeout exceeded")
return
case result := <-longRunningOperation():
fmt.Println("Result:", result)
}
}()
Ключевые моменты:
context.WithTimeoutустанавливает лимит времениctx.Done()сигнализирует о завершении- Обязательно вызывайте
cancel()черезdefer
Для критичных операций можно добавить recover() в горутину:
go func() {
defer func() {
if r := recover(); r != nil {
log.Println("Recovered:", r)
}
}()
// опасный код
}()