func AverageLatency(host string) (latency int64, err error) { REQUESTS_LIMIT := 100 results := make(chan int64, REQUESTS_LIMIT) errorsResults := make(chan string, REQUESTS_LIMIT) for w := 1; w <= REQUESTS_LIMIT; w++ { go func() { start := time.Now() if _, err := net.LookupHost(host); err != nil { errorResults <- err.Error() return } results <- time.Since(start).Nanoseconds() / int64(time.Millisecond) } } requestsDone := 1 for a := 1; a <= REQUESTS_LIMIT; a++ { select { case latencyLocal := <-results: latency = latency + latencyLocal requestsDone = requestsDone + 1 case errorMsg := <-errorsResults: return 0, errors.New(errorMsg) case <-time.After(time.Second * DURATION_SECONDS): return latency / int64(requestsDone), nil } } return latency / int64(requestsDone), nil }