我有以下代码:package mainimport ( "fmt" "time")type Response struct { Data string Status int}func main() { var rc [10]chan Response for i := 0; i < 10; i++ { rc[i] = make(chan Response) } var responses []Response for i := 0; i < 10; i++ { go func(c chan<- Response, n int) { c <- GetData(n) close(c) }(rc[i], i) } for _, resp := range rc { responses = append(responses, <-resp) } for _, item := range responses { fmt.Printf("%+v\n", item) }}func GetData(n int) Response { time.Sleep(time.Second * 5) return Response{ Data: "adfdafcssdf4343t43gf3jn4jknon239nwcwuincs", Status: n, }}你能告诉我哪种方法是实现相同目标但使用单一渠道的正确方法吗?
1 回答
慕标琳琳
TA贡献1830条经验 获得超9个赞
由于您可以同时编写不同的数组和切片元素,因此您不需要任何通道。有关详细信息,请参阅我可以同时编写不同的切片元素。
只需启动您的 goroutine,并让它们写入适当的数组(或切片)元素。使用 async.WaitGroup等待全部完成:
wg := &sync.WaitGroup{}
var responses [10]Response
for i := range responses {
wg.Add(1)
go func(n int) {
defer wg.Done()
responses[n] = GetData(n)
}(i)
}
wg.Wait()
for _, item := range responses {
fmt.Printf("%+v\n", item)
}
这与您的代码输出相同。在Go Playground上尝试一下。
- 1 回答
- 0 关注
- 111 浏览
添加回答
举报
0/150
提交
取消