arrays - 重构代码以惯用的方式使用单个通道
问题描述
我有以下代码:
package main
import (
"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,
}
}
你能告诉我哪种方法是实现相同目标但使用单一渠道的正确方法吗?
解决方案
由于您可以同时编写不同的数组和切片元素,因此您不需要任何通道。有关详细信息,请参阅我可以同时编写不同的切片元素。
只需启动您的 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上尝试一下。
推荐阅读
- java - 如何使用 tools.jar 编译方法打印 java 编译器错误日志?
- r - 为什么编织 pdf_document 需要很长时间?
- python - 从字典中删除空元素
- android - React Native Android 中的 AAB Bundle Size 太大
- kubernetes - Pod 是否使用 k8s API 服务器来获取规范声明?
- javascript - 如何从弹出窗口中获取复选框值以使其更改页面的 CSS?
- c++ - 多态向量 C++ – 没有匹配的成员函数来调用“比较”
- sql - 将层次结构放在其自己的单独维度中还是将其设置为相关维度的一部分?
- algorithm - Mandelbrot 集的内部距离估计算法
- performance - SpyderKernelApp WARNING No such comm in windows 10 on spyder3 ide