for-loop - 为什么这个 for 循环永远不会退出?

标签 for-loop go

有下面的代码,使用它会导致死循环。来自 channel 的值是正确的,变量sum的值也是正确的。所有的 goroutines 最终都没有错误。

func responseHandler(w http.ResponseWriter, r *http.Request) {
    var c = make(chan string)
    for i := 0; i < 100; i++ {
        url := fmt.Sprintf("someurl/page%v/etc", i)
        go parse(url, i, c)
        if i%5 == 0 {
            time.Sleep(1000 * time.Millisecond)
        }
    }
    for range c {
        sum = append(sum, <-c)
    }
    fmt.Println("Exit from channel wait")
    fmt.Fprintln(w, sum)
}

func parse(url string, num int, c chan string) {
    response, err1 := http.Get(url)
    if err1 != nil {
        log.Fatal(err1)
    }
    defer response.Body.Close()

    if response.StatusCode != 200 {
        log.Fatalf("status code error: %d %s", response.StatusCode, 
response.Status)
    }

    res, err := DecodeHTMLBody(response.Body, "windows-1251")

    doc, err := goquery.NewDocumentFromReader(res)
    if err != nil {
        log.Fatal(err)
    }

    doc.Find(".b-advItem__content").Each(func(i int, s *goquery.Selection) {
        title := strings.TrimSpace(s.Find(".someclass").Text())
        price := strings.TrimSpace(s.Find(".someclass").Text())
        formatPrice := parsePrice(price)
        c <- fmt.Sprintf("output %d: %s:%s\n", i, title, formatPrice)
    })
    fmt.Printf("Channel %d - exit\n", num)

求和 - 全局[]字符串。

最佳答案

channel 上的 range 语句只有在 channel 关闭时才会退出(好吧,想一想:否则 range 会如何检测到没有更多的数据可以获取? ),并且不会在您的代码中关闭 channel 。

关于for-loop - 为什么这个 for 循环永远不会退出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51296516/

相关文章:

go - 是否可以在不丢失行号前缀的情况下包装 logrus.Logger 函数?

go - 为什么 Golang 中 stdin 生成的数组将最后一项转换为零?

java - 未进入for循环

ios - 运行 SKAction x 次

python - 如何使用 Python 输出嵌套循环的结果

google-app-engine - 如何使用 Go 运行时在 App Engine 上的实例之间传递套接字?

go - 在golang中重用Process以保留环境变量

xml - 如何解决 XQUERY 1.0 FLOWR 中的自动增量 var 情况?

for-loop - DOS - 尝试理解分隔符以找到最低行数的 inf 文件

go - 在遍历 slice 并通过 "slice bounds out of range"修改它时出现 "append()"错误