【发布时间】:2019-08-04 14:03:04
【问题描述】:
我试图理解以下从通道通道读取的代码。我很难理解这个想法。
bridge := func(done <-chan interface{}, chanStream <-chan <-chan interface{}) <-chan interface{} {
outStream := make(chan interface{})
go func() {
defer close(outStream)
for {
var stream <-chan interface{}
select {
case <-done:
return
case maybeSteram, ok := <-chanStream:
if ok == false {
return
}
stream = maybeSteram
}
for c := range orDone(done, stream) {
select {
case outStream <- c:
case <-done: // Why we are selection from the done channel here?
}
}
}
}()
return outStream
}
orDone 函数:
orDone := func(done <-chan interface{}, inStream <-chan interface{}) <-chan interface{} {
outStream := make(chan interface{})
go func() {
defer close(outStream)
for {
select {
case <-done:
return
case v, ok := <-inStream:
if ok == false {
return
}
select {
case outStream <- v:
case <-done: // Again why we are only reading from this channel? Shouldn't we return from here?
// Why we are not retuening from here?
}
}
}
}()
return outStream
}
正如评论中提到的,我需要一些帮助来理解我们为什么选择for c := range orDone(donem, stream)。谁能解释这里发生了什么?
提前致谢。
编辑
我从concurrency in go 中获取了代码。完整代码可以在这里找到:https://github.com/kat-co/concurrency-in-go-src/blob/master/concurrency-patterns-in-go/the-bridge-channel/fig-bridge-channel.go
【问题讨论】:
-
您能参考一下您在哪里找到的吗? (链接)
-
我从一本名为
concurrency in go的书中获取了参考。代码可以在这里找到:github.com/kat-co/concurrency-in-go-src/blob/master/…