chanA <- chanB: отправить и получить значение или сам канал? - PullRequest
0 голосов
/ 18 октября 2019

Похоже, что компилятор Go будет выполнять две совершенно разные семантические операции в зависимости от типов в следующем примере:

chanA <- chanB </p>

Если chanA имеет тип (chan chan <-string), эта операция отправит chanA, type (chan <- string), сама в chanA. </p>

Однако, если chanA имеет тип (chan <- string), она попытается извлечь строку из chanB,подразумевается, что тип chanB равен (<-chan строка). </p>

Это единственный способ выяснить это, чтобы узнать типы, или есть простой способ узнать, когда канал отправляет значения по сравнению с самим собой?

Я смотрю на этот пример из книги программирования Go: https://github.com/adonovan/gopl.io/blob/master/ch8/chat/chat.go

Ответы [ 2 ]

1 голос
/ 18 октября 2019

Очень легко сказать.

chanA <- anything

отправляет значение anything на chanA, независимо от того, что anything.

chanA <- <- chanB

получаетзначение от chanB и отправка его на chanA.

Ваш второй оператор здесь:

Однако, если chanA имеет тип (chan <- string), он попытаетсяизвлечь строку из chanB </p>

это ваша проблема. foo <- bar - это всегда операция отправки. Компилятор Go читает слева направо, и identifier <- - это операция отправки.

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

0 голосов
/ 18 октября 2019

Ваше предположение неверно.

chanA <- chanB

Вышеуказанное будет работать, только если chanA имеет тип chan chan something. Он отправит chanB более chanA. Он не будет читать из chanB.

Чтобы прочитать значение из chanB и отправить его через chanA, вам необходимо:

chanA <- <- chanB
...