我的GO应用程序,我经常需要查询列表或网址。由于GO从头开始是异步的,因此它是使用此功能的理想场所。
解决这个问题的最佳方法是什么?我找到了一个blog提出了一个解决方案,但它失败了,并列出了一个空的网址列表。
谢谢!
答案 0 :(得分:1)
我已经在您提供的博客链接中调整了代码,并使其更容易出错。
下面的代码应该编译,并且应该处理边界情况,例如空输入urls
切片。
package main
import (
"fmt"
"net/http"
"os"
"time"
)
const timeout time.Duration = 3 * time.Second
var urls = []string{
"http://golang.org/",
"http://stackoverflow.com/",
"http://i.wanta.pony/", // Should error
}
type httpResponse struct {
url string
response *http.Response
err error
}
func asyncHTTPGets(urls []string, ch chan *httpResponse) {
for _, url := range urls {
go func(url string) {
resp, err := http.Get(url)
ch <- &httpResponse{url, resp, err}
}(url)
}
}
func main() {
responseCount := 0
ch := make(chan *httpResponse)
go asyncHTTPGets(urls, ch)
for responseCount != len(urls) {
select {
case r := <-ch:
if r.err != nil {
fmt.Printf("Error %s fetching %s\n", r.err, r.url)
} else {
fmt.Printf("%s was fetched\n", r.url)
}
responseCount++
case <-time.After(timeout):
os.Exit(1)
}
}
}
答案 1 :(得分:0)
由于您使用的是无缓冲的频道,因此它会被阻止,直到网址被处理完毕。