可能是我看不出明显的事情,我做错了什么:
func printSize (listOfUrls []string){
var wg sync.WaitGroup
wg.Add(len(listOfUrl))
for _, myurl := range(listOfUrls){
go func(){
body := getUrlBody(myurl)
fmt.Println(len(body))
wg.Done()
}()
}
wg.Wait()
}
如果我删除了wg并且去了,我会正确地获得每个url主体的大小。如果我如上所述,它几乎立即打印零。 getUrlBody()需要时间来执行有时几分钟。
回答评论:我也是这样尝试的,当然,它表现出同样的行为。 我发现错误发生在getUrlBody和main()函数中......
func printSize(listOfUrls []string) {
var wg sync.WaitGroup
wg.Add(len(listOfUrls))
for _, myurl := range listOfUrls {
go f(myurl, &wg)
}
wg.Wait()
}
func f(myurl string, wg *sync.WaitGroup) {
body := getUrlBody(myurl)
fmt.Println(len(body))
wg.Done()
}
答案 0 :(得分:2)
所有goroutine都在共享单个null
变量。有关详细信息,请参阅https://golang.org/doc/faq#closures_and_goroutines。
将代码更改为:
myurl
或
func f(listOfUrls []string){
var wg sync.WaitGroup
wg.Add(len(listOfUrl))
for _, myurl := range(listOfUrls){
go func(myurl string){
body := getUrlBody(myurl)
fmt.Println(len(body))
wg.Done()
}(myurl)
}
wg.Wait()
}