为什么函数会提前返回?

我刚刚开始学习go,并且一直在完成巡回演出。最后一个练习是编辑Web爬网程序以并行爬网,而无需重复。

这是练习的链接:http : //tour.golang.org/#70

这是代码。我只更改了爬网和主要功能。因此,我将发布这些内容以使其保持整洁。

 // Crawl uses fetcher to recursively crawl

    // pages starting with url, to a maximum of depth.

    var used = make(map[string]bool)

    var urlchan = make(chan string)

    func Crawl(url string, depth int, fetcher Fetcher) {

        // TODO: Fetch URLs in parallel.

        // Done: Don't fetch the same URL twice.

        // This implementation doesn't do either:

        done := make(chan bool)

        if depth <= 0 {

            return

        }

        body, urls, err := fetcher.Fetch(url)

        if err != nil {

            fmt.Println(err)

            return

        }

        fmt.Printf("\nfound: %s %q\n\n", url, body)

        go func() {

            for _, i := range urls {

                urlchan <- i

            }

            done <- true

        }()

        for u := range urlchan {

            if used[u] == false {

                used[u] = true

                go Crawl(u, depth-1, fetcher)

            }

            if <-done == true {

                break

            }

        }

        return

    }


    func main() {

        used["http://golang.org/"] = true

        Crawl("http://golang.org/", 4, fetcher)

    }

问题是,当我运行程序时,爬网程序在打印后停止


    not found: http://golang.org/cmd/

仅当我尝试使程序并行运行时,才会发生这种情况。如果我让它线性运行,那么所有网址都可以正确找到。


注意:如果我没有正确执行此操作(我的意思是并行),则表示歉意。


慕的地6264312
浏览 200回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go