Ответ
Плюсы:
- Контроль выполнения – предотвращает зависание горутин при неожиданных блокировках.
- Упрощение логики – не нужно вручную отслеживать завершение через каналы.
- Ресурсы – гарантирует освобождение ресурсов (память, соединения) даже при ошибках.
Минусы:
- Ложные срабатывания – горутина может завершиться, хотя еще выполняла полезную работу.
- Сложность отладки – труднее определить причину таймаута (блокировка vs долгий расчет).
- Нет гарантии – горутина может "зависнуть" и не завершиться (например, deadlock).
Пример:
func worker(timeout time.Duration) {
done := make(chan struct{})
go func() {
// Долгая операция
time.Sleep(2 * timeout)
close(done)
}()
select {
case <-done:
fmt.Println("Успешно завершено")
case <-time.After(timeout):
fmt.Println("Таймаут")
}
}