arrays - 重构代码以惯用方式使用单个 channel

标签 arrays go concurrency slice channel

我有以下代码:

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,
    }
}
您能告诉我,使用一个 channel 来实现相同目标的正确方法是什么?

最佳答案

由于可以同时编写不同的数组和 slice 元素,因此您不需要任何 channel 。有关详细信息,请参见Can I concurrently write different slice elements
只需启动您的goroutine,并将它们写在适当的数组(或 slice )元素中即可。使用 sync.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上尝试一下。
另请参阅相关:How to collect values from N goroutines executed in a specific order?

关于arrays - 重构代码以惯用方式使用单个 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64838433/

相关文章:

json - 如何使用 Golang 解码动态 json 对象

c++ - cuFFT 流的并发

concurrency - 可以对并发代码进行静态检查吗?

c++ - 为什么我的函数无法使用指针打印多维数组的元素?

pointers - 在 Go 中取消引用指针

macros - Go 中的 C 风格宏

java - 并行迁移巨大的 XML 文件列表

arrays - 如何在 Scala 中编写多态输入函数?

php - 让 SQL 从嵌套数组中选择

java - 在颜色数组中转换随机颜色