//go:build !solution package main import ( "fmt" "io" "net/http" "os" "time" ) type HTTPGetResult struct { Success bool Body string Elapsed time.Duration Size int URL string Error error } func (result HTTPGetResult) String() string { if result.Success { return fmt.Sprintf("%v\t%v\t%v", result.Elapsed, result.Size, result.URL) } else { return result.Error.Error() } } func GetHTTPBody(url string, ch chan string) { startTime := time.Now() resp, err := http.Get(url) if err != nil { ch <- fmt.Sprint(err) return } defer resp.Body.Close() n, err := io.Copy(io.Discard, resp.Body) if err != nil { ch <- fmt.Sprint(err) return } ch <- fmt.Sprintf("%.2fs\t%v\t%v", time.Since(startTime).Seconds(), n, url) } func main() { startTime := time.Now() urls, ch := os.Args[1:], make(chan string) for _, url := range urls { go GetHTTPBody(url, ch) } for range urls { fmt.Println(<-ch) } fmt.Printf("%.2fs elapsed\n", time.Since(startTime).Seconds()) }