gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:08:02 25 4
gpt4 key购买 nike

我有以下代码:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com