Тот, кто посылает данные, может закрыть (close) канал, чтобы указать, что больше значений отправлено не будет. Получатели данных могут проверить, закрыт ли канал, использовав второй параметр в выражении получения: после
v, ok := <-ch
ok будет false, если больше нет значений для получения, и канал закрыт.
Цикл for i := range c получает значения из канала до тех пор, пока он не закрыт.
Замечание: Только отправитель данных должен закрывать канал, но никогда - получатель. Попытка отправить данные в закрытый канал вызовет panic.
Еще замечание: Каналы не как файлы; обычно вам не надо их закрывать. Закрывать необходимо, только когда получателю надо указать, что данных для получения больше нет, например, для завершения цикла range.
package main
import (
"fmt"
)
func fibonacci(n int, c chan int) {
x, y := 0, 1
for i := 0; i < n; i++ {
c <- x
x, y = y, x+y
}
close(c)
}
func main() {
c := make(chan int, 10)
go fibonacci(cap(c), c)
for i := range c {
fmt.Println(i)
}
}
Вывод:
0
1
1
2
3
5
8
13
21
34
Читайте также:
- Основы языка Go: Go-процедуры (goroutines)
- Основы языка Go: каналы
- Основы языка Go: буферизированные каналы
Комментариев нет:
Отправить комментарий