【发布时间】:2017-03-05 07:09:21
【问题描述】:
由于某种原因,一旦我开始通过 goroutine 中的通道添加字符串,代码在运行时就会停止。我认为这是一个范围/关闭问题,所以我将所有代码直接移到函数中,但无济于事。我查看了 Golang 的文档,所有示例看起来都与我的相似,所以我对出了什么问题一无所知。
func getPage(url string, c chan<- string, swg sizedwaitgroup.SizedWaitGroup) {
defer swg.Done()
doc, err := goquery.NewDocument(url)
if err != nil{
fmt.Println(err)
}
nodes := doc.Find(".v-card .info")
for i := range nodes.Nodes {
el := nodes.Eq(i)
var name string
if el.Find("h3.n span").Size() != 0{
name = el.Find("h3.n span").Text()
}else if el.Find("h3.n").Size() != 0{
name = el.Find("h3.n").Text()
}
address := el.Find(".adr").Text()
phoneNumber := el.Find(".phone.primary").Text()
website, _ := el.Find(".track-visit-website").Attr("href")
//c <- map[string] string{"name":name,"address":address,"Phone Number": phoneNumber,"website": website,};
c <- fmt.Sprint("%s%s%s%s",name,address,phoneNumber,website)
fmt.Println([]string{name,address,phoneNumber,website,})
}
}
func getNumPages(url string) int{
doc, err := goquery.NewDocument(url)
if err != nil{
fmt.Println(err);
}
pagination := strings.Split(doc.Find(".pagination p").Contents().Eq(1).Text()," ")
numItems, _ := strconv.Atoi(pagination[len(pagination)-1])
return int(math.Ceil(float64(numItems)/30))
}
func main() {
arrChan := make(chan string)
swg := sizedwaitgroup.New(8)
zips := []string{"78705","78710","78715"}
for _, item := range zips{
swg.Add()
go getPage(fmt.Sprintf(base_url,item,1),arrChan,swg)
}
swg.Wait()
}
编辑: 所以我通过传递大小的等待组作为参考来修复它,但是当我删除缓冲区时它不起作用,这是否意味着我需要提前知道有多少元素将发送到通道?
【问题讨论】:
-
您的代码既不是独立的(例如缺少 sizedwaitgroup)也不是最小示例。你可以提供实际的错误。
-
比赛是错误-
-
提供赏金固然不错,但如果您想得到答案,则应首先遵守此处发布的 cmets。首先,提供Minimal, Complete, and Verifiable example。并将该示例设为您最近的最新代码,因为您声称您已对代码进行了多次更改,但我没有看到它们反映在您在问题中发布的代码中。
标签: go concurrency goroutine