Sobes.tech
Middle

Was passiert in einem Programm mit einer Goroutine, die in einen Kanal schreibt, und einer Range über den Kanal ohne ihn zu schließen?

sobes.tech KI

Antwort von 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) после окончания записи.