英文:
How does *http.Response.Body read method work?
问题
假设以下代码,我正在从一个HTTP GET请求的响应中读取数据,Read方法在内部是如何工作的?
它是一次性获取数据并根据缓冲区大小进行写入,然后在下一次迭代中使用相同的数据和更新的游标,还是在缓冲区填满之前获取数据,然后在下一次迭代中再次获取数据?
var resp *http.Response
buf := make([]byte, 50)
for {
r, err := resp.Body.Read(buf)
if err == io.EOF {
break
}
}
Read方法会尽可能多地读取数据并将其存储在提供的缓冲区中。在每次迭代中,它会尝试从响应的Body中读取数据,并将读取的字节数存储在变量r中。如果读取到达文件末尾(EOF),则会返回io.EOF错误,循环会终止。
在每次迭代中,Read方法会更新缓冲区的内容,以便在下一次读取时存储新的数据。如果缓冲区没有完全填满,Read方法会尽可能多地读取数据,直到达到缓冲区的末尾。如果缓冲区已满,Read方法会返回,并在下一次迭代中继续读取数据。
总之,Read方法会根据缓冲区的大小尽可能多地读取数据,并在下一次迭代中使用更新后的缓冲区。
英文:
Assuming below code, I am reading from an http get request response, How does the Read method work internally ?
Does it gets the data in one go internally and writes based on buf size and on next iteration uses same data with updated cursor or gets the data till buf is full then gets the data again in the next iteration ?
var resp *http.Response
buf := make([]byte, 50)
for {
r, err := resp.Body.Read(buf)
if err == io.EOF {
break
}
}
答案1
得分: 0
根据Reader接口的文档:
Read方法将最多len(p)个字节读入p中。它返回读取的字节数(0 <= n <= len(p))和遇到的任何错误。即使Read返回n < len(p),在调用期间它也可能使用p的所有空间作为临时空间。如果有一些数据可用但不足len(p)个字节,Read通常会返回可用的数据而不是等待更多数据。
从Body
的角度来看,Response文档提供了一些详细信息:
响应体在读取Body字段时按需进行流式传输。如果网络连接失败或服务器终止响应,Body.Read调用将返回错误。
英文:
According to the Reader interface documentation:
> Read reads up to len(p) bytes into p. It returns the number of bytes
> read (0 <= n <= len(p)) and any error encountered. Even if Read
> returns n < len(p), it may use all of p as scratch space during the
> call. If some data is available but not len(p) bytes, Read
> conventionally returns what is available instead of waiting for more.
the Response documentation goes into a little detail from the Body
perspective:
> The response body is streamed on demand as the Body field is read. If
> the network connection fails or the server terminates the response,
> Body.Read calls return an error.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论