takeStream <- <- valueStream
- это объединение операции получения ( оператор получения ) и оператор отправки .
Оператор получения является унарным оператором и, как таковой, , имеет наивысший приоритет ( Spe c: операторы ), а оператор send является оператором и выходит за пределы иерархии операторов. Как следствие, c1 <- <- c2
совпадает с c1 <- (<-c2)
.
Таким образом, ваш пример такой же, как:
takeStream <- (<-valueStream)
(Обратите внимание, что любая другая интерпретация не будет имеет смысл.)
И Spe c: Отправить операторы:
И канал, и выражение значения оцениваются до начала связи.
Передаваемое значение должно быть оценено перед отправкой. Итак, ваш пример сначала получает значение от valueStream
, а затем отправляет это значение на takeStream
...
... Или так было бы, если бы этот оператор отправки (и оператор получения) стоять самостоятельно.
При использовании внутри оператора select
в качестве одного из операторов связи case
, происходит следующее:
Цитирование из Spe c: Выберите операторы:
Выполнение оператора "select" выполняется в несколько этапов:
- Для всех случаи в операторе, операнды канала операций приема и выражения канала и правой части операторов отправки оцениваются ровно один раз, в порядке исходного кода, при вводе оператора выбора. Результатом является набор каналов для приема или отправки и соответствующие значения для отправки. Любые побочные эффекты в этой оценке будут происходить независимо от того, какая (если таковая имеется) операция связи выбрана для продолжения. Выражения в левой части RecvStmt с кратким объявлением или присваиванием переменной еще не оценены.
[...]
Поэтому, когда у вас есть это :
select {
case <- done :
return
case takeStream <- <- valueStream:
}
Затем оценивается <-valueStream
(значение получено из valueStream
). Если операция блокируется, то весь select
будет блокироваться (даже если done
закрыт и, таким образом, готов к приему от).
Как только значение получено из valueStream
, только тогда оно будет будет решено, может ли это значение быть отправлено на takeStream
, и будет ли выбрано это case
, если другие случаи также могут продолжаться.
Если одно или несколько сообщений может продолжаться, то одно, которое может продолжаться, выбирается с помощью равномерного псевдослучайного выбора. В противном случае, если есть случай по умолчанию, этот случай выбирается. Если регистр по умолчанию отсутствует, оператор SELECT блокируется до тех пор, пока не будет продолжено хотя бы одно из сообщений.