package mainimport ( "os" "net/http" "fmt" "io/ioutil" "strings")func main(){ for _,arg :=range os.Args[1:]{ if !strings.HasPrefix(arg,"http://"){ //检查输入的url 中是否有协议前缀 arg= "http://"+arg } res,err := http.Get(arg) if err !=nil{ //遇到错误 返回状态码并且退出 fmt.Fprint(os.Stderr,"fetch: %s:%v\n",err,res.Status) os.Exit(1) } body,err := ioutil.ReadAll(res.Body)//读取数据流 存入 body中 res.Body.Close() if err != nil{ //遇到错误 返回状态码并且退出 fmt.Fprint(os.Stderr,"fetch %s:%v:$s",arg,err,res.Status) os.Exit(1) } fmt.Printf("%s:$s",body,res.Status) }}
命令行中输入 go build xxx.go
./xxx www.baidu.com
以上是单线程的例子接下来使用go 关键字 开发一个多线程的
package mainimport ( "os" "time" "fmt" "net/http" "io" "io/ioutil" "strings")func main(){ start := time.Now() ch := make(chan string) for _,url :=range os.Args[1:]{ go fetch(url,ch) } for range os.Args[1:]{ fmt.Println(<-ch) } fmt.Printf("%.2fs elapsed\n",time.Since(start).Seconds())}func fetch(url string,ch chan<- string){ start := time.Now() if(!strings.HasPrefix(url,"http://")){ url ="http://"+ url } res,err := http.Get(url) if err != nil{ ch <- fmt.Sprint(err) return } nbytes,err := io.Copy(ioutil.Discard,res.Body) res.Body.Close() if err != nil{ ch <- fmt.Sprint("while rading %s:$v",url,err) return } secs := time.Since(start).Seconds() ch <- fmt.Sprint("%.2fs %7d %s",secs,nbytes,url)}
支持多个链接
尝试一下 还是蛮好玩的