Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗goSpChRg 161 of 280 menu
◀ ▶

Перебор канала до конца в Go

Цикл с range по каналу забирает значения по одному, пока канал не закроют. После закрытия и опустошения цикл сам заканчивается, отдельный признак в теле не нужен.

В ветке отправим три строки и завершим канал; в main напечатаем каждую:

package main import "fmt" func main() { ch := make(chan string) go func() { ch <- "a" ch <- "b" ch <- "c" close(ch) }() for s := range ch { fmt.Println(s) } }

На экране три строки "a", "b" и "c". Без закрытия цикл ждал бы следующую отправку бесконечно.

Тот же прием с буфером: все значения уже лежат в очереди, но цикл все равно ждет закрытия, чтобы понять конец:

package main import "fmt" func main() { ch := make(chan int, 3) ch <- 1 ch <- 2 close(ch) for v := range ch { fmt.Println(v) } }

Дан следующий код:

ch := make(chan int, 2) ch <- 10 ch <- 20

Добавьте в main завершение канала и цикл, который выведет оба числа.

Дан следующий код:

ch := make(chan int) go func() { ch <- 1 }() for v := range ch { fmt.Println(v) }

Скажите, почему цикл здесь не закончится сам.

Скажите, чем перебор канала отличается от перебора среза с тем же range.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить