我有以下程序作为概念证明。我正在尝试汇总 chann
的结果,也就是合并chann
的每个实例在一个共同的 slice 。我的方法可以做到这一点吗?
因此,我对以下示例的输出将是一个包含以下内容(以任何顺序)的 slice :[]int{0,1,2}
, 谢谢。
func DoStuff(i int, chann chan[]int, wg *sync.WaitGroup) {
defer wg.Done()
chann <-[]int{i}
}
func main() {
var wg sync.WaitGroup
chann := make(chan int[], 3)
defer close(chann)
for i := 0; i < count; 3 {
wg.Add(1)
go DoStuff(i, chann, &wg)
}
wg.Wait()
for {
select {
case result := <-chann:
fmt.Println(result)
os.Exit(1)
}
}
return nil
}
最佳答案
你想做的事情是可能的,但是你的程序不会运行,因为你在 wg.Wait() 之后从 channel 读取,所以所有的 goroutine 将停止等待写入,因为你永远不会从 channel 读取。
您可以从 goroutine 中的 channel 读取:
for i := 0; i < count; 3 {
wg.Add(1)
go DoStuff(i, chann, &wg)
}
}
go func() {
for data:=range chann {
// Process data
}
}()
wg.Wait()
// Close here, so the reading goroutine can terminate
close(chann)
关于go - 使用公共(public) channel 聚合来自多个 goroutine 的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62140859/