Sobes.tech
Junior — Middle

Cum se implementează o încheiere sigură a unei goroutines atunci când rezultatul așteptat nu a fost primit, folosind construcția switch-case?

sobes.tech AI

Răspuns de la AI

Pentru a încheia în siguranță o goroutine în timp ce așteaptă un rezultat, poți folosi construcția select cu mai multe cazuri, inclusiv un timeout sau un semnal de anulare. În Go, nu există un switch-case direct pentru canale, dar select îndeplinește o funcție similară.

Exemplu cu timeout:

func worker(done chan struct{}) {
    select {
    case result := <-someChannel:
        fmt.Println("Rezultat primit:", result)
    case <-time.After(5 * time.Second):
        fmt.Println("Timeout atins, încheierea goroutine")
        return
    case <-done:
        fmt.Println("Semanl de încheiere primit")
        return
    }
}

Aici, goroutine-ul așteaptă date de la someChannel. Dacă datele nu sosesc în 5 secunde, se activează timeout-ul și goroutine-ul se încheie. De asemenea, se poate trimite un semnal prin canalul done pentru a o încheia forțat.

Această abordare previne blocarea goroutine-ului și permite controlul sigur al acesteia.