1 回答

TA貢獻1840條經驗 獲得超5個贊
為了解決這種情況,標準庫中的幾個io.ReadCloser實現支持對Read和Close 的并發調用,其中 Close 中斷了一個活動的 Read。
由 net/http Transport創建的響應正文閱讀器是這些實現之一。在響應主體上同時調用 Read 和 Close 是安全的。
您還可以通過調用Transport CancelRequest 方法來中斷響應正文上的活動讀取。
以下是如何在 body 上使用 close 實現取消:
func readLines(response *http.Response, outgoing chan string, done chan struct{}) error {
cancel := make(chan struct{})
go func() {
select {
case <-done:
response.Body.Close()
case <-cancel:
return
}()
defer response.Body.Close()
defer close(cancel) // ensure that goroutine exits
reader := bufio.NewReader(response.Body)
for {
line, err := reader.ReadString('\n')
if err != nil {
return err
}
outgoing <- line
}
}
從另一個 goroutine 調用 close(done) 將取消對主體的讀取。
- 1 回答
- 0 關注
- 260 瀏覽
添加回答
舉報