Sobes.tech
Middle

Wat gebeurt er in een programma met een goroutine die naar een kanaal schrijft, en een range over het kanaal zonder het te sluiten?

sobes.tech AI

Antwoord van AI

Если горутина пишет в канал, а другая горутина делает range по этому каналу без его закрытия, то range будет бесконечно ждать новых значений и не завершится.

range по каналу читает значения до тех пор, пока канал не будет закрыт. Если канал не закрыт, range блокируется на операции чтения, ожидая новые данные.

В итоге программа может зависнуть или горутина с range будет висеть в ожидании, если писатель продолжает писать или перестал, но не закрыл канал.

Пример:

data := make(chan int)
go func() {
    for i := 0; i < 5; i++ {
        data <- i
    }
    // канал не закрывается
}()

for v := range data {
    fmt.Println(v) // после 5 значений будет блокировка
}

Чтобы range завершился, канал нужно закрыть с помощью close(data) после окончания записи.