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

我有以下代码:


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,

    }

}

你能告诉我哪种方法是实现相同目标但使用单一渠道的正确方法吗?


撒科打诨
浏览 115回答 1
1回答

慕标琳琳

由于您可以同时编写不同的数组和切片元素,因此您不需要任何通道。有关详细信息,请参阅我可以同时编写不同的切片元素。只需启动您的 goroutine,并让它们写入适当的数组(或切片)元素。使用 async.WaitGroup等待全部完成:wg := &sync.WaitGroup{}var responses [10]Responsefor i := range responses {&nbsp; &nbsp; wg.Add(1)&nbsp; &nbsp; go func(n int) {&nbsp; &nbsp; &nbsp; &nbsp; defer wg.Done()&nbsp; &nbsp; &nbsp; &nbsp; responses[n] = GetData(n)&nbsp; &nbsp; }(i)}wg.Wait()for _, item := range responses {&nbsp; &nbsp; fmt.Printf("%+v\n", item)}这与您的代码输出相同。在Go Playground上尝试一下。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go