<分区>
假设我有一个 go 接收 channel 。有没有办法让我同时收听所有这些内容?例如:
channels := make([]<-chan int, 0, N)
// fill the slice with channels
for _, channel := range channels {
<-channel
}
是我能做到的最接近的。但是,此实现取决于 slice 元素的顺序。
为清楚起见,我不需要知道 go channel 的值。我只需要知道他们都完成了。
<分区>
假设我有一个 go 接收 channel 。有没有办法让我同时收听所有这些内容?例如:
channels := make([]<-chan int, 0, N)
// fill the slice with channels
for _, channel := range channels {
<-channel
}
是我能做到的最接近的。但是,此实现取决于 slice 元素的顺序。
为清楚起见,我不需要知道 go channel 的值。我只需要知道他们都完成了。
最佳答案
您可以使用同步包来创建 WaitGroup 。 添加到 waitGroup 后,为每个 channel 启动一个 goroutine。 最后,当 channel 完成时,它会递减 waitGroup。调用者只是等待 WaitGroup 。这是 playground link .
package main
import (
"fmt"
"sync"
"time"
)
func main() {
wg := sync.WaitGroup{}
numChans := 10
chans := make([]chan interface{}, numChans)
for i:=0;i<numChans;i++ {
chans[i] = make(chan interface{})
wg.Add(1)
go func(c chan interface{}) {
defer wg.Done()
<-c
}(chans[i])
}
//simulate closing channels
go func(){
time.Sleep(time.Second)
fmt.Println("closing")
for _, ch := range chans{
close(ch)
}
}()
fmt.Println("waiting")
wg.Wait()
}
关于go - 同时收听一系列 go channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55036639/