Sobes.tech
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.

Co się stanie w programie z gorutyną, która pisze do… - sobes.tech