我想用不同于主要功能的功能编写过程功能的内容。
我想计算没有导致“resp,err:= client.Do(req)”错误的URL数量。
我想在主函数中写入fmt.Println(“Finish!”)之前的成功次数。
我该怎么办?
func main() {
site_list := [][]string{
{"site1","https://www.aaaa"},
{"site2","https://www.bbbb"},
{"site3","https://www.cccc"},
{"site4","https://www.dddd"},
}
var wg sync.WaitGroup
maxChan := make(chan bool, 2)
for _, v := range site_list {
maxChan <- true
wg.Add(1)
go process(v[1], maxChan, &wg)
}
wg.Wait()
fmt.Println("Finish!")
}
func process(site_url string, maxChan chan bool, wg *sync.WaitGroup) {
defer wg.Done()
defer func(maxChan chan bool) {
<-maxChan
}(maxChan)
req, err := http.NewRequest("GET", site_url, nil)
client := new(http.Client)
resp, err := client.Do(req)
if err != nil {
fmt.Println("client.Doエラー" + site_url)
return
}
defer resp.Body.Close()
}
最佳答案
根据我上面的评论,创建一个自定义工作项目结构:
type urlItem struct {
Name string
Url string
Err error
}
使用指针,以便
process()
函数可以更新基础结构:site_list := []*urlItem{
&urlItem{"site1", "https://www.aaaa", nil},
&urlItem{"site2", "https://www.bbbb", nil},
&urlItem{"site3", "https://www.cccc", nil},
&urlItem{"site4", "https://www.dddd", nil},
}
process()
然后可以安全地更新它的特定工作项(不需要任何互斥或同步),因为每个例程都可以得到一个唯一的工作项。func process(site *urlItem, maxChan chan bool, wg *sync.WaitGroup) { /* ... */ }
然后在末尾计算例程
errors
:var failCount int
for _, v := range site_list {
if v.Err != nil {
failCount++
}
}
Playground Example
关于go - 如何将成功或失败结果返回到goroutine到main函数和fmt.Println成功次数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59826939/