Middle
Co się stanie w programie z gorutyną, która pisze do kanału, i pętlą range po kanale bez zamknięcia?
sobes.tech AI
Odpowiedź od AI
Jeśli gorutyna pisze do kanału, a inna gorutyna wykonuje range na tym kanale bez jego zamknięcia, to range będzie nieskończenie oczekiwać na nowe wartości i się nie zakończy.
range odczytuje wartości z kanału do momentu jego zamknięcia. Jeśli kanał nie jest zamknięty, range blokuje się na operacji odczytu, oczekując na nowe dane.
W efekcie program może się zawiesić lub gorutyna z range będzie czekać, jeśli piszący nadal pisze lub przestał, ale nie zamknął kanału.
Przykład:
data := make(chan int)
go func() {
for i := 0; i < 5; i++ {
data <- i
}
// kanał nie jest zamknięty
}()
for v := range data {
fmt.Println(v) // po 5 wartościach blokada
}
Aby range się zakończył, należy zamknąć kanał za pomocą close(data) po zakończeniu pisania.