diff --git a/ch1/dmfetchall/1_10.go b/ch1/dmfetchall/1_10.go new file mode 100644 index 0000000..68abbb0 --- /dev/null +++ b/ch1/dmfetchall/1_10.go @@ -0,0 +1,48 @@ +package main + +import ( + "fmt" + "io" + "io/ioutil" + "log" + "net/http" + "os" + "strings" + "time" +) + +func main() { + start := time.Now() + ch := make(chan string) + if len(os.Args[1:]) < 1 { + log.Fatal("needs args") + } + for _, url := range os.Args[1:] { + if !strings.HasPrefix(url, "http://") { + url = "http://" + url + } + go fetch(url, ch) + } + for range os.Args[1:] { + fmt.Println(<-ch) + } + fmt.Printf("%.2fs\n", time.Since(start).Seconds()) + main() +} + +func fetch(url string, ch chan string) { + start := time.Now() + resp, err := http.Get(url) + if err != nil { + ch <- fmt.Sprint(err) + return + } + defer resp.Body.Close() + nbytes, err := io.Copy(ioutil.Discard, resp.Body) + if err != nil { + ch <- fmt.Sprint(err) + return + } + elapsed := time.Since(start).Seconds() + ch <- fmt.Sprintf("%.2fs %7d %s", elapsed, nbytes, url) +} diff --git a/ch1/dmfetchall/1_11.go b/ch1/dmfetchall/1_11.go new file mode 100644 index 0000000..44107fd --- /dev/null +++ b/ch1/dmfetchall/1_11.go @@ -0,0 +1,54 @@ +package main + +import ( + "fmt" + "io" + "io/ioutil" + "log" + "net/http" + "os" + "strings" + "time" +) + +func main() { + start := time.Now() + ch := make(chan string) + if len(os.Args[1:]) < 1 { + log.Fatal("needs args") + } + for _, url := range os.Args[1:] { + if !strings.HasPrefix(url, "http://") { + url = "http://" + url + } + go fetch(url, ch) + } + longest := time.After(time.Duration(time.Second)) + for range os.Args[1:] { + select { + case s := <-ch: + fmt.Println(s) + case <-longest: + fmt.Println("took too long") + break + } + } + fmt.Printf("%.2fs\n", time.Since(start).Seconds()) +} + +func fetch(url string, ch chan string) { + start := time.Now() + resp, err := http.Get(url) + if err != nil { + ch <- fmt.Sprint(err) + return + } + defer resp.Body.Close() + nbytes, err := io.Copy(ioutil.Discard, resp.Body) + if err != nil { + ch <- fmt.Sprint(err) + return + } + elapsed := time.Since(start).Seconds() + ch <- fmt.Sprintf("%.2fs %7d %s", elapsed, nbytes, url) +} diff --git a/ch1/dmfetchall/main.go b/ch1/dmfetchall/main.go new file mode 100644 index 0000000..34a68ef --- /dev/null +++ b/ch1/dmfetchall/main.go @@ -0,0 +1,47 @@ +package main + +import ( + "fmt" + "io" + "io/ioutil" + "log" + "net/http" + "os" + "strings" + "time" +) + +func main() { + start := time.Now() + ch := make(chan string) + if len(os.Args[1:]) < 1 { + log.Fatal("needs args") + } + for _, url := range os.Args[1:] { + if !strings.HasPrefix(url, "http://") { + url = "http://" + url + } + go fetch(url, ch) + } + for range os.Args[1:] { + fmt.Println(<-ch) + } + fmt.Printf("%.2fs\n", time.Since(start).Seconds()) +} + +func fetch(url string, ch chan string) { + start := time.Now() + resp, err := http.Get(url) + if err != nil { + ch <- fmt.Sprint(err) + return + } + defer resp.Body.Close() + nbytes, err := io.Copy(ioutil.Discard, resp.Body) + if err != nil { + ch <- fmt.Sprint(err) + return + } + elapsed := time.Since(start).Seconds() + ch <- fmt.Sprintf("%.2fs %7d %s", elapsed, nbytes, url) +}