Перебор канала до конца в 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.