Ваш код немного запутанный.Но если я правильно понимаю, что вы пытаетесь сделать, вы обрабатываете список запросов и хотите вернуть URL-адрес и статус каждого запроса, а также время выполнения каждого запроса.И вы хотите обрабатывать их параллельно.
Вам вообще не нужно использовать WaitGroups.WaitGroups хороши, когда вы просто хотите запустить кучу задач, не заботясь о результатах, просто хотите знать, когда все будет сделано.Но если вы возвращаете результаты, каналов достаточно.
Вот пример кода, который делает то, что я думаю, вы пытаетесь сделать
package main
import (
"time"
"fmt"
)
type Result struct {
URL string
Status string
Finished string
}
func task(url string, c chan string, d chan string) {
time.Sleep(time.Second)
c <- url
d <- "Success"
}
func main() {
var results []Result
urls := []string{"url1", "url2", "url3", "url4", "url5"}
c := make(chan string, len(urls))
d := make(chan string, len(urls))
for _, u := range urls {
go task(u, c, d)
}
for i := 0; i < len(urls); i++ {
res := Result{}
res.URL = <-c
res.Status = <-d
res.Finished = time.Now().UTC().Format(time.RFC3339)
results = append(results, res)
}
fmt.Println(results)
}
Вы можете попробовать это на детской площадке https://play.golang.org/p/N3oeA7MyZ8L
Тем не менее, это немного хрупко.Вы делаете каналы того же размера, что и ваш список URL.Это будет хорошо работать для нескольких URL, но если у вас есть список из миллиона URL, вы создадите довольно большой канал.Возможно, вы захотите установить разумный размер буфера канала и проверить, готов ли канал к обработке перед отправкой вашего запроса.Таким образом, вы не будете делать миллион запросов одновременно.