Sobes.tech
Junior — Middle

Jak określić, która z gorutyn zakończy pracę z kanałem?

sobes.tech AI

Odpowiedź od AI

W Go nie można bezpośrednio określić, która gorutyna zamknęła kanał, ponieważ kanały nie zawierają informacji o tym, kto je zamknął. Jednak zwykle stosuje się umowę:

  • Gorutyna, która pisze do kanału, jest odpowiedzialna za jego zamknięcie.
  • Gorutyny odczytujące otrzymują sygnał zamknięcia przez drugi parametr podczas odczytu: value, ok := <-ch. Jeśli ok == false, kanał jest zamknięty.

Aby dowiedzieć się, która gorutyna zamknęła kanał, można użyć dodatkowych mechanizmów, na przykład przesyłać strukturalne wiadomości z identyfikatorami przez kanał lub używać oddzielnych kanałów sygnałowych lub kontekstów (context.Context) do koordynacji.

Przykład:

ch := make(chan int)

// Gorutyna, która pisze i zamyka kanał
go func() {
    defer close(ch)
    ch <- 1
}()

// Gorutyna, która odczytuje
go func() {
    for v := range ch {
        fmt.Println(v)
    }
    fmt.Println("Kanał zamknięty")
}()

W tym przykładzie, to pierwsza gorutyna zamyka kanał. Aby wyraźnie wiedzieć, kto zamknął kanał, można dodać logowanie lub używać dodatkowych kanałów sygnałowych.