Sobes.tech
Junior — Middle

Jak zaimplementować bezpieczne zakończenie goroutine, gdy nie otrzymano oczekiwanego wyniku, używając konstrukcji switch-case?

sobes.tech AI

Odpowiedź od AI

Aby bezpiecznie zakończyć gorutynę podczas oczekiwania na wynik, można użyć konstrukcji select z wieloma przypadkami, w tym z limitem czasu lub sygnałem anulowania. W Go nie ma bezpośredniego switch-case dla kanałów, ale select pełni podobną funkcję.

Przykład z limitem czasu:

func worker(done chan struct{}) {
    select {
    case result := <-someChannel:
        fmt.Println("Otrzymany wynik:", result)
    case <-time.After(5 * time.Second):
        fmt.Println("Przekroczono limit czasu, kończenie gorutyny")
        return
    case <-done:
        fmt.Println("Odebrano sygnał zakończenia")
        return
    }
}

Tutaj gorutyna oczekuje danych z someChannel. Jeśli dane nie nadejdą w ciągu 5 sekund, uruchamia się limit czasu i gorutyna kończy się. Można też wysłać sygnał przez kanał done, aby wymusić zakończenie.

Takie podejście zapobiega zawieszeniu gorutyny i pozwala na jej bezpieczne kontrolowanie.