Sobes.tech
Назад к вопросам
Junior — Middle
79

Каким образом можно остановить выполнение горутины, если до нее так и не дошло ожидаемое значение?

Компании, где спрашивали
IDT

Ответ от нейросети

sobes.tech AI

В Go для остановки горутины, которая ожидает значение, но это значение может не прийти, обычно используют каналы с таймаутом или контекст с отменой.

Пример с таймаутом через select и time.After:

select {
case val := <-ch:
    // получили значение, продолжаем работу
case <-time.After(time.Second * 5):
    // таймаут, прекращаем работу горутины
}

Другой способ — использовать контекст (context.Context), который можно отменить извне:

ctx, cancel := context.WithCancel(context.Background())

go func() {
    select {
    case val := <-ch:
        // обработать val
    case <-ctx.Done():
        // остановка горутины
    }
}()

// где-то в коде вызываем cancel(), чтобы остановить горутину

Таким образом, горутина не будет висеть в ожидании бесконечно и сможет корректно завершиться.