вторник, 15 января 2019 г.

Основы Go: каналы, использование range и close

Тот, кто посылает данные, может закрыть (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


Читайте также:


Комментариев нет:

Отправить комментарий