練習 1.7:
函數調用io.Copy(dst, src)會從src中讀取內容,並將讀到的結果寫入到dst中,使用這個函數替代掉例子中的ioutil.ReadAll來拷貝響應結構體到os.Stdout,避免申請一個緩沖區(例子中的b)來存儲。記得處理io.Copy返回結果中的錯誤。
func main() {
for _,url := range os.Args[1:] {
resp,err := http.Get(url)
if err != nil {
fmt.Fprintf(os.Stderr, "http-get: %v\n",err)
os.Exit(10)
}
//b,err := ioutil.ReadAll(resp.Body)
_, err = io.Copy(os.Stdout, resp.Body) //在這里輸出內容到標准輸出
if err != nil {
fmt.Fprintf(os.Stderr,"fetch: reading %s: %v\n", url,err)
os.Exit(10)
}
resp.Body.Close()
}
}
練習 1.8: 修改fetch這個范例,如果輸入的url參數沒有 http:// 前綴的話,為這個url加上該前綴。你可能會用到strings.HasPrefix這個函數。
練習 1.9: 修改fetch打印出HTTP協議的狀態碼,可以從resp.Status變量得到該狀態碼。
func main() {
for _,url := range os.Args[1:] {
if ! strings.HasPrefix(url,"http://") { //在這里判斷輸入的url是否含有 http://
url = "http://" + url
}
resp,err := http.Get(url)
if err != nil {
fmt.Fprintf(os.Stderr, "http-get: %v\n",err)
os.Exit(10)
}
fmt.Printf("http-get: %v\n",resp.Status) //打印出HTTP協議的狀態碼
//b,err := ioutil.ReadAll(resp.Body)
_, err = io.Copy(os.Stdout, resp.Body)
if err != nil {
fmt.Fprintf(os.Stderr,"fetch: reading %s: %v\n", url,err)
os.Exit(10)
}
resp.Body.Close()
}
}
