为了账号安全,请及时绑定邮箱和手机立即绑定

重构代码以惯用的方式使用单个通道

重构代码以惯用的方式使用单个通道

Go
撒科打诨 2022-07-11 17:09:19
我有以下代码: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上尝试一下。


查看完整回答
反对 回复 2022-07-11
  • 1 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信