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 ще чака (ще блокира) до появата на данни или затварянето на канала.