среда, 29 мая 2019 г.

Спецификация Go: типы каналов (channel types)

Канал (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). Например, если одна программа отправляет значения по каналу, а вторая программа получает их, значения принимаются в порядке отправки.


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


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

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