cpp

Возврат канала из функции

Канал можно вернуть из функции. При использовании небуфферизированных каналов важно учитывать, что после записи поток будет блокирован до момента прочтения, поэтому дело до оператора return не дойдет и получится взаимная блокировка. В этом случае запись в канал нужно выполнять в отдельном потоке (листинг 18.14).

Листинг 18.14. Возврат канала из функции

package main

import "fmt"

func main() {
   ch := test()
   for v := range ch {
      fmt.Println(v)
   }
   ch2 := test2()
   fmt.Println(<-ch2)
}
func test() chan int {
   var ch chan int = make(chan int, 3)
   ch <- 10
   ch <- 20
   ch <- 30
   close(ch)
   return ch
}
func test2() chan int {
   var ch chan int = make(chan int)
   // ch <- 40 // Так нельзя! Блокировка!
   go func() {
      ch <- 40 // OK
   }()
   return ch
}

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp