1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| package main
import ( "context" "fmt" "net/http" "sync" "time" )
func main() { urls := []string{ "https://httpbin.org/delay/1", "https://httpbin.org/delay/2", "https://httpbin.org/delay/3", }
var wg sync.WaitGroup results := make(chan string, len(urls))
for _, url := range urls { wg.Add(1) go func(url string) { defer wg.Done() if result, err := fetchWithTimeout(url, 5*time.Second); err != nil { results <- fmt.Sprintf("Error fetching %s: %v", url, err) } else { results <- fmt.Sprintf("Success: %s - %s", url, result) } }(url) }
go func() { wg.Wait() close(results) }()
for result := range results { fmt.Println(result) } }
func fetchWithTimeout(url string, timeout time.Duration) (string, error) { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel()
req, err := http.NewRequestWithContext(ctx, "GET", url, nil) if err != nil { return "", err }
client := &http.Client{} resp, err := client.Do(req) if err != nil { return "", err } defer resp.Body.Close()
return resp.Status, nil }
|