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

我一直在进行游览,并且完成了网络爬虫练习,但是我认为我用来打印所有结果的技术可能效率不高。

这是我的代码。我只编辑了爬网和主要功能,所以我将其发布。这是练习的链接(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)”,但是用这种方式,我必须找到每次使用的变量的长度。


有一个更好的方法吗?


扬帆大鱼
浏览 231回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go