我想用不同于主要功能的功能编写过程功能的内容。

我想计算没有导致“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/

10-13 05:05