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
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