Sobes.tech
Junior — Middle

Как се държи програмата при използване на range за четене от затворен, небуфериран канал?

sobes.tech AI

Отговор от AI

При използване на range за четене от канал в Go, цикълът ще получава стойности от канала, докато той не бъде затворен. Ако каналът е затворен и всички стойности вече са прочетени, range ще приключи цикъла.

За небуфериран канал това работи по същия начин като за буфериран: ако каналът е затворен, range не блокира и излиза от цикъла.

Пример:

ch := make(chan int)
func() {
    ch <- 1
    ch <- 2
    close(ch)
}()

for v := range ch {
    fmt.Println(v) // Ще изведе 1 и 2, след което цикълът ще приключи
}

Ако каналът е затворен, но няма данни, range ще приключи веднага. Ако каналът не е затворен, но няма данни, range ще чака (ще блокира) до появата на данни или затварянето на канала.