go語言聖經-併發獲取多個url
1.go最新奇的特性就是對併發程式設計的支援,goroutine和channel
2.goroutine是一種函式的併發執行方式,而channel是用來在goroutine之間進行引數傳遞
go function則表示建立乙個新的goroutine,並在這個新的goroutine中執行這個函式。
3.make函式建立了乙個傳遞string型別引數的channel
4.io.copy把響應的body內容拷貝到ioutil.discard輸出流中,扔到乙個垃圾桶
5.goroutine嘗試在乙個channel上做send或者receive操作時,這個goroutine會阻塞在呼叫處,直到另乙個goroutine往這個channel裡寫入、或者接收值
6.用main函式來接收所有fetch函式傳回的字串,可以避免在goroutine非同步執行還沒有完成時main函式提前退出。
練習 1.10: 找乙個資料量比較大的**,用本小節中的程式調研**的快取策略,對每個url執行兩遍請求,檢視兩次時間是否有較大的差別,並且每次獲取到的響應內容是否一致,修改本節中的程式,將響應結果輸出,以便於進行對比。
練習 1.11: 在fetchall中嘗試使用長一些的引數列表,比如使用在alexa.com的上百萬**裡排名靠前的。如果乙個**沒有回應,程式將採取怎樣的行為?(section8.9 描述了在這種情況下的應對機制)。
fetchall.go
package main對比fetch.go//匯入io/ioutil和net/http包
//接收並列印channel,for迴圈不需要key value
for range os.args[1:]
//main函式的時間
fmt.printf("main: %.2fs \n",time.since(start).seconds())
}//引數型別:string , chan
//判斷錯誤
if err != nil
//輸出http code
//把內容扔掉,只獲取位元組數
nbytes , err:=io.copy(ioutil.discard, res.body)
//判斷錯誤
if err != nil
res.body.close()
//記錄執行的秒數
sec := time.since(start).seconds()
//傳送給channelch}
package main執行效果對比://匯入io/ioutil和net/http包
//判斷錯誤
if err != nil
//body,err := ioutil.readall(res.body)
//避免申請乙個緩衝區,直接到標準輸出流
nbytes,err:=io.copy(ioutil.discard, res.body)
//判斷錯誤
if err != nil
res.body.close()
//輸出http code
//結束時間
sec:=time.since(start).seconds()
fmt.printf("main:%.2fs\n",sec)
}
Go語言聖經習題練習 1 6併發獲取多個URL
練習 1.10 找乙個資料量比較大的 用本小節中的程式調研 的快取策略,對每個url執行兩遍請求,檢視兩次時間是否有較大的差別,並且每次獲取到的響應內容是否一致,修改本節中的程式,將響應結果輸出,以便於進行對比。練習 1.11 在fatchall中嘗試使用長一些的引數列表,比如使用在alexa.co...
日常 go語言聖經 獲取URL練習題
1.主要使用net http和io ioutil包 2.http.get函式是建立http請求的函式,resp這個結構體中,body欄位包括乙個可讀的伺服器響應流 3.ioutil.readall函式從response中讀取到全部內容,resp.body.close關閉resp的body流 4.用o...
日常 Go語言聖經 Map習題
練習 4.8 修改charcount程式,使用unicode.isletter等相關的函式,統計字母 數字等unicode中不同的字元類別。練習 4.9 編寫乙個程式wordfreq程式,報告輸入文字中每個單詞出現的頻率。在第一次呼叫scan前先呼叫input.split bufio.scanwor...