Как создать канал только для приема каналов? - PullRequest
0 голосов
/ 20 февраля 2019

Я хочу создать канал, из которого кто-то может получать только каналы, доступные только для приема, например:

c := make(chan <-chan int)

Однако я не могу читать с этого канала:

invalid operation: <-c (receive from send-only type chan<- chan int)

( Playground link ) Из сообщения об ошибке ясно, что мой синтаксис chan <-chan интерпретируется как chan<- chan, то есть канал каналов только для отправки.Выполнение gofmt даже изменяет код, чтобы отразить это.

Итак, как мне обозначить тип канала, который я хочу?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Если с синтаксисом Go что-то неясно, первое, что нужно проверить - спецификация языка .По сравнению с другими языками, спецификация Go более читабельна и короче.

Точно это упоминается в Спецификация: Типы каналов:

Связывается оператор <-с крайней левой chan возможной:

chan<- chan int    // same as chan<- (chan int)
chan<- <-chan int  // same as chan<- (<-chan int)
<-chan <-chan int  // same as <-chan (<-chan int)
chan (<-chan int)

Ответ ясен и прост в этих нескольких цитируемых строках.

  • Причина для того, что вы испытываете: оператор <- ассоциируется с самым левым из возможных chan.
  • означает того, что вы пробовали: chan<- chan int соответствует chan<- (chan int)
  • Решение того, чего вы хотите достичь (последняя строка): chan (<-chan int)
0 голосов
/ 20 февраля 2019

Ответ прост: добавьте скобки.

c := make(chan (<-chan int))

Альтернативой, которая может быть более читабельна в некоторых ситуациях, будет создание нового типа для внутреннего канала:

type ReceiveOnlyIntChan <-chan int
c := make(chan ReceiveOnlyIntChan)
...