Получение из канала

Получение из канала - это операция чтения данных, отправленных в канал. При получении данных из канала мы используем оператор <-, который указывает на направление передачи данных. В случае получения данных оператор располагается слева от переменной канала. В результате операции получения мы получаем значение, которое было отправлено в канал.

При получении из канала мы можем получить как одно значение, так и два значения. Второе значение - это булево значение, которое показывает, открыт ли канал. Если канал закрыт, второе значение будет равно false.

Синтаксис

govalue := <-ch
value, ok := <-ch

Пример получения одного значения

Давайте получим значение из канала:

gopackage main

import "fmt"

func main() {
  ch := make(chan int)

  go func() {
    ch <- 42
  }()

  res := <-ch
  fmt.Println(res)
}

Результат выполнения кода:

go42

Пример получения с проверкой открытости канала

Давайте получим значение из канала и проверим, открыт ли канал:

gopackage main

import "fmt"

func main() {
  ch := make(chan string)

  go func() {
    ch <- "abcde"
    close(ch)
  }()

  res, ok := <-ch
  fmt.Printf("res: %s, ok: %t\n", res, ok)
}

Результат выполнения кода:

go"res: abcde, ok: true"

Пример получения из закрытого канала

Давайте получим значение из закрытого канала:

gopackage main

import "fmt"

func main() {
  ch := make(chan int)
  close(ch)

  res, ok := <-ch
  fmt.Printf("res: %d, ok: %t\n", res, ok)
}

Результат выполнения кода:

go"res: 0, ok: false"

Пример чтения из канала в цикле

Давайте прочитаем все значения из канала в цикле:

gopackage main

import "fmt"

func main() {
  ch := make(chan int)

  go func() {
    for i := 1; i <= 5; i++ {
      ch <- i
    }
    close(ch)
  }()

  for res := range ch {
    fmt.Println(res)
  }
}

Результат выполнения кода:

go"1"
"2"
"3"
"4"
"5"

Смотрите также

  • операцию отправки в канал,
    которая позволяет отправить данные в канал
  • функцию close,
    которая закрывает канал и сигнализирует о завершении работы
  • конструкцию select,
    которая позволяет работать с несколькими каналами одновременно
  • понятие каналов,
    которые используются для обмена данными между горутинами