Junior — Middle
Как да спрем изпълнението на горутината, ако очакваната стойност все още не е достигната?
sobes.tech AI
Отговор от 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(), за да спрем горутината
По този начин, горутината няма да чака безкрайно и ще може да приключи коректно.