gpt4 book ai didi

go - go中一个 channel 使用两个箭头写入另一个 channel 是什么意思

转载 作者:行者123 更新时间:2023-12-01 20:23:22 25 4
gpt4 key购买 nike

这是 Go 中的并发一书中的代码示例。在 select block 中是以下语句

case takeStream <- <- valueStream:

我不知道双箭头是做什么的,文中也没有解释。当我用

替换它时,输出会发生变化
case takeStream <- valueStream:

这显然是必要的

功能齐全:

func take(done<- chan interface{}, valueStream <- chan interface{}, num int) <- chan interface{}{
takeStream := make ( chan interface{})
go func() {
defer close(takeStream)
for i := 0; i < num; i ++ {
select {
case <- done :
return
case takeStream <- <- valueStream:
}
}
}()

return takeStream
}

已编辑:如果我理解正确,扩展的语句将是

i := 5
valueStream <- i
tmp <- valueStream
takeStream <- tmp

所以

takeStream <- <- valuesStream

是捷径

这就解释了为什么当我打电话时

fmt.Println(<-takeStream)

我得到了一些奇怪的数字 - 大概是 valueStream 的一些数字表示

谢谢!

最佳答案

takeStream <- <- valueStream是接收操作 ( receive operator ) 和 send statement 的串联.

接收运算符是一元运算符,因此具有最高优先级 (Spec: Operators),发送语句是 语句,不属于运算符层次结构。因此,c1 <- <- c2c1 <- (<-c2) 相同.

所以你的例子是一样的:

takeStream <- (<-valueStream)

(请注意,任何其他解释都没有任何意义。)

和规范:发送声明:

Both the channel and the value expression are evaluated before communication begins.

必须先评估要发送的值,然后才能发送。因此,您的示例首先从 valueStream 接收一个值,然后将该值发送到 takeStream ...

...如果这个发送语句(和接收操作符)独立存在的话,它会是这样。

select 中使用时作为 case 的通信操作之一的声明,然后会发生这种情况:

引自 Spec: Select statements:

Execution of a "select" statement proceeds in several steps:

  1. For all the cases in the statement, the channel operands of receive operations and the channel and right-hand-side expressions of send statements are evaluated exactly once, in source order, upon entering the "select" statement. The result is a set of channels to receive from or send to, and the corresponding values to send. Any side effects in that evaluation will occur irrespective of which (if any) communication operation is selected to proceed. Expressions on the left-hand side of a RecvStmt with a short variable declaration or assignment are not yet evaluated.

[...]

所以当你有这个时:

select {
case <- done :
return
case takeStream <- <- valueStream:
}

然后 <-valueStream被评估(从 valueStream 接收一个值)。如果操作是阻塞的,那么整个 select将阻塞(即使 done 已关闭并准备好接收)。

一旦从 valueStream 接收到值, 只有这样才能决定是否可以在 takeStream 上发送该值,以及这是否 case如果其他情况也可以继续,则选择。

  1. If one or more of the communications can proceed, a single one that can proceed is chosen via a uniform pseudo-random selection. Otherwise, if there is a default case, that case is chosen. If there is no default case, the "select" statement blocks until at least one of the communications can proceed.

关于go - go中一个 channel 使用两个箭头写入另一个 channel 是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60030756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com