Sobes.tech
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(), за да спрем горутината

По този начин, горутината няма да чака безкрайно и ще може да приключи коректно.