Канал (channel) предоставляет одновременно выполняемым функциям механизм для обмена данными путем отправки и получения значений определенного типа элемента. Значение не инициализированного канала равно nil.
ChannelType = ( "chan" | "chan" "<-" | "<-" "chan" ) ElementType .
Необязательный оператор <- указывает направление канала, отправлять или получать. Если направление не указано, канал является двунаправленным. Канал может быть ограничен только для отправки или только для получения путем назначения или явного преобразования.
chan T // может быть использован для отправки и получения значений типа T
chan<- float64 // может быть использован только для отправки float64s
<-chan int // может быть использован только для получения ints
Оператор <- ассоциируется с самым левым возможным chan:
chan<- chan int // то же самое что и chan<- (chan int)
chan<- <-chan int // то же самое что и chan<- (<-chan int)
<-chan <-chan int // то же самое что и <-chan (<-chan int)
chan (<-chan int)
Новое, инициализированное значение канала может быть создано с использованием встроенной функции make, которая принимает тип канала и необязательную емкость в качестве аргументов:
make(chan int, 100)
Емкость, в количестве элементов, устанавливает размер буфера в канале. Если пропускная способность равна нулю или отсутствует, канал не буферизуется, и связь устанавливается успешно только тогда, когда отправитель и получатель готовы. В противном случае канал буферизуется, и связь успешно завершается без блокировки, если буфер не заполнен (отправляет) или не пуст (получает). nil канал никогда не готов к общению.
Канал может быть закрыт с помощью встроенной функции close. Многозначная форма назначения оператора получения сообщает о том, было ли полученное значение отправлено до закрытия канала.
Один канал может использоваться в операторах отправки, операциях приема и вызовах встроенных функций cap и len любым количеством процедур без дальнейшей синхронизации. Каналы действуют как очереди «первым пришел - первым обслужен» (first-in-first-out, FIFO). Например, если одна программа отправляет значения по каналу, а вторая программа получает их, значения принимаются в порядке отправки.
Читайте также:
Комментариев нет:
Отправить комментарий