【发布时间】:2020-05-18 17:01:03
【问题描述】:
这是来自 Go 中的并发一书的代码示例。在 select 块中是以下语句
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发送valueStream频道本身,而不是从valueStream获得的值。
标签: go concurrency channels