package main import ( "fmt" "net/http" "time" ) var urls = []string{ "https://splice.com/", "https://golang.org/", "https://matt.aimonetti.net/", } type HttpResponse struct { url string response *http.Response err error } func asyncHttpGets(urls []string) []*HttpResponse { ch := make(chan *HttpResponse, len(urls)) // buffered responses := []*HttpResponse{} for _, url := range urls { go func(url string) { fmt.Printf("Fetching %s \n", url) resp, err := http.Get(url) if err == nil { resp.Body.Close() } ch <- &HttpResponse{url, resp, err} }(url) } for { select { case r := <-ch: fmt.Printf("%s was fetched\n", r.url) responses = append(responses, r) if len(responses) == len(urls) { return responses } case <-time.After(50 * time.Millisecond): fmt.Printf(".") } } return responses } func main() { results := asyncHttpGets(urls) for _, result := range results { if result.err != nil { fmt.Printf("%s error: %v\n", result.url, result.err) continue } fmt.Printf("%s status: %s\n", result.url, result.response.Status) } }