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.