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 关注
- 233 浏览
添加回答
举报