为了账号安全,请及时绑定邮箱和手机立即绑定

如何从并发和递归函数打印结果?

如何从并发和递归函数打印结果?

Go
扬帆大鱼 2021-05-13 10:20:34
我一直在进行游览,并且完成了网络爬虫练习,但是我认为我用来打印所有结果的技术可能效率不高。这是我的代码。我只编辑了爬网和主要功能,所以我将其发布。这是练习的链接(http://tour.golang.org/#70)   var used = make(map[string]bool)    func Crawl(url string, depth int, fetcher Fetcher, results chan string) {        if depth <= 0 {            return        }        body, urls, err := fetcher.Fetch(url)        if err != nil {            results <- fmt.Sprintf("%v",err)            return        }        results <-fmt.Sprintf("\nfound: %s %q\n", url, body)        for _,u := range urls {            if used[u] == false {                used[u] = true                go Crawl(u, depth-1, fetcher, results)            }        }        return    }    //------------------------------------------------------------    func main() {        used["http://golang.org/"] = true        results := make(chan string)        go Crawl("http://golang.org/", 4, fetcher, results)        for i := 0; i < len(used); i++ {            fmt.Println(<-results)        }    }我主要使用“ for i <len(used)”行,以确保仅在有结果要打印时才打印结果的值。我不能只用    for i := range results因为它是递归的,所以很难在爬网函数中使用“ close(results)”,但是用这种方式,我必须找到每次使用的变量的长度。有一个更好的方法吗?
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 230 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信