去例程从URL下载到文件

时间:2016-05-12 03:35:56

标签: go goroutine

我当前正在学习GO。在学习了一些基础知识之后,我一直在尝试编写一个小程序,它使用goroutine同时将网页(切片中的网址)下载到不同的文件中。这是我写的一些代码:

func downloadFromUrl(url string) {
    tokens := strings.Split(url, "/")
    fileName := tokens[len(tokens)-1]
    // I took out the bit that download the file for testing.
    fmt.Println("Downloading", url, "to", fileName)

}

我评论了实际下载页面以进行测试的位。在我的主要功能中,我这样做:

func main() {
    urls := []string{"http://www.google.com", "http://www.yahoo.com", "http://www.google.com"}

    for _, url := range urls {
        fmt.Println(url);
        go downloadFromUrl(url);
    }
}

问题是,当我使用表达式go downloadFromUrl(url);函数downloadFromUrl不运行时。但是如果我只是在循环中使用downloadFromUrl(url)它就可以了。我究竟做错了什么?我是否必须在惯例中使用频道?

1 个答案:

答案 0 :(得分:6)

问题是你的goroutine返回之前的主要退出,最简单的解决方案是使用sync.WaitGroup

func main() {
    urls := []string{"http://www.google.com", "http://www.yahoo.com", "http://www.google.com"}
    var wg sync.WaitGroup
    for _, url := range urls {
        wg.Add(1)
        log.Println(url)
        go downloadFromUrl(url, &wg)
    }
    wg.Wait()
}

func downloadFromUrl(url string, wg *sync.WaitGroup) {
    defer wg.Done()
    ....
}