Получение из канала
Получение из канала - это операция чтения данных, отправленных в канал.
При получении данных из канала мы используем оператор <-,
который указывает на направление передачи данных.
В случае получения данных оператор располагается слева от переменной канала.
В результате операции получения мы получаем значение, которое было отправлено в канал.
При получении из канала мы можем получить как одно значение,
так и два значения. Второе значение - это булево значение,
которое показывает, открыт ли канал. Если канал закрыт,
второе значение будет равно false.
Синтаксис
value := <-ch
value, ok := <-ch
Пример получения одного значения
Давайте получим значение из канала:
package main
import "fmt"
func main() {
ch := make(chan int)
go func() {
ch <- 42
}()
res := <-ch
fmt.Println(res)
}
Результат выполнения кода:
42
Пример получения с проверкой открытости канала
Давайте получим значение из канала и проверим, открыт ли канал:
package 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)
}
Результат выполнения кода:
"res: abcde, ok: true"
Пример получения из закрытого канала
Давайте получим значение из закрытого канала:
package main
import "fmt"
func main() {
ch := make(chan int)
close(ch)
res, ok := <-ch
fmt.Printf("res: %d, ok: %t\n", res, ok)
}
Результат выполнения кода:
"res: 0, ok: false"
Пример чтения из канала в цикле
Давайте прочитаем все значения из канала в цикле:
package 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)
}
}
Результат выполнения кода:
"1"
"2"
"3"
"4"
"5"
Смотрите также
-
операцию
отправки в канал,
которая позволяет отправить данные в канал -
функцию
close,
которая закрывает канал и сигнализирует о завершении работы -
конструкцию
select,
которая позволяет работать с несколькими каналами одновременно -
понятие
каналов,
которые используются для обмена данными между горутинами