我了解通道的常规行为是在读取后清空。是否有一种方法可以保留未缓冲通道值以进行多次读取,而不会从通道中删除该值?
例如,我有一个goroutine生成单个数据供多个下游goroutines使用。我不想创建多个通道或使用缓冲通道,这将要求我复制源数据(我甚至不知道需要多少份副本)。实际上,我想能够执行以下操作:
例如,我有一个goroutine生成单个数据供多个下游goroutines使用。我不想创建多个通道或使用缓冲通道,这将要求我复制源数据(我甚至不知道需要多少份副本)。实际上,我想能够执行以下操作:
main{
ch := make(ch chan dType)
ch <- sourceDataGenerator()
for _,_ := range DynamicRange{
go TargetGoRoutine(ch)
}
close(ch) // would want this to remove the value and the channel
}
func(ch chan dType) TargetGoRoutine{
targetCollection <- ch // want to keep the channel value after read
}
编辑 有人认为这是一个重复的问题。也许是,但不确定。最后,像 n-canter 指出的那样,这里的解决方法似乎很简单。所有它需要的就是每个Go协程在使用完数据后将其放回通道中进行“回收”。没有任何所谓的“重复”提供了这种解决方案。以下是一个示例:
package main
import (
"fmt"
"sync"
)
func main() {
c := make(chan string)
var wg sync.WaitGroup
wg.Add(5)
for i := 0; i < 5; i++ {
go func(i int) {
wg.Done()
msg := <-c
fmt.Printf("Data:%s, From go:%d\n", msg, i)
c <-msg
}(i)
}
c <- "Original"
wg.Wait()
fmt.Println(<-c)
}