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śliok == 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.