2016-01-06 106 views
0

我只需要獲得的前幾行)的請求即可。有沒有辦法做到這一點。我不需要整個響應。我需要匹配一個只會在前幾行出現的模式。獲取整個響應並獲得正則表達式的速度非常慢,因爲響應中的字符數非常大。這是實現它的最快方式。 目前我在做http在Go中獲取請求(獲取幾行)

http.Get(<url>) 

//返回響應

ioutil.readAll(response of the above url) 

//返回一個字節數組

MyFunction(search for reg exp in the byte array) 

有沒有去取幾行或避免獲取方法整個響應和匹配模式。

+1

響應是一個流,你碰巧使用了一個叫做'readAll'的方法。我敢打賭,你可以找到一些其他的選擇,如readline。 – evanmcdonnal

回答

5

不要使用ReadAll,剛剛看了你知道塊將大到足以捕捉你想要

// response must be in the first 2048 bytes 
buf := make([]byte, 2048) 
n, err := resp.Body.Read(buf) 
MyFunction(buf[:n]) 

或通過io.LimitedReader

buf, err := ioutil.ReadAll(io.LimitReader(resp.Body, 2048)) 

或者,如果您請求的一部分真的需要通過管路與閱讀,一個bufio.Scanner

scanner := bufio.NewScanner(resp.Body) 
for i := 0; i < fewLines && scanner.Scan(); i++ { 
    MyFunction(scanner.Bytes()) 
} 

但請注意,如果您沒有完成讀取響應正文,則會阻止您的客戶端重新使用連接,並且如果有大量傳入數據,服務器可能不會像您經常提前關閉連接一樣。

3

如果您知道需要從響應中讀取多少內容,則可以使用LimitReader(https://golang.org/pkg/io/#LimitedReader),否則,最簡單的方法是使讀取(或掃描儀)消耗您的身體,直到完成圖案。