package main
import (
"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 main
import (
"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)
}
支持多个链接
尝试一下 还是蛮好玩的