chanA <- chanB :发送和接收值或发送通道本身?

chanA <- chanB : send and receive value or send channel itself?

Go 编译器似乎会根据以下示例中的类型执行两种完全不同的语义操作:

chanA <-chanB

如果 chanA 的类型为 (chan chan<- string),此操作会将类型为 (chan<- string) 的 chanB 本身发送给 chanA。

但是,如果 chanA 的类型是 (chan<- string),它会尝试从 chanB 中提取一个字符串,这意味着 chanB 的类型是 (<-chan string)。

唯一的推理方法是知道类型,还是有一种简单的方法来判断通道何时发送值而不是它本身?

我正在看 Go Programming Book 中的这个例子:https://github.com/adonovan/gopl.io/blob/master/ch8/chat/chat.go

很容易分辨。

chanA <- anything

正在 chanA 上发送值 anything,无论 anything 是什么。

chanA <- <- chanB

正在从 chanB 接收一个值并在 chanA 上发送它。

你在这里的第二个声明:

However, if chanA is type (chan<- string), it will try to extract a string from chanB

是你的问题。 foo <- bar 总是 发送操作。 Go编译器从左到右读取,identifier <-为发送操作。

接收操作是一个求值为值的表达式,因此它只能在值有效的地方有效 - 即,编译器必须已经遇到赋值操作、发送操作、函数的第一部分通话等

你的假设是错误的。

chanA <- chanB

只有当 chanA 的类型为 chan chan something 时,以上内容才有效。它将在 chanA 上发送 chanB。它不会从 chanB.

读取

要从 chanB 读取值并将其发送到 chanA,您需要:

chanA <- <- chanB