Go 读取http.Body时io.LimitReader EOF
这对某些人来说可能是非常明显的,但我需要一点帮助,看看我哪里出了问题。 我试图使用io.LimitReader限制从http.Response.Body读取的数据。我正在直接读取[]字节。然而,当我尝试这样做时,我得到了一个EOF。下面是代码的模型Go 读取http.Body时io.LimitReader EOF,go,Go,这对某些人来说可能是非常明显的,但我需要一点帮助,看看我哪里出了问题。 我试图使用io.LimitReader限制从http.Response.Body读取的数据。我正在直接读取[]字节。然而,当我尝试这样做时,我得到了一个EOF。下面是代码的模型 resp, err := http.Client.Do(req) if err != nil { return nil, err } defer resp.Body.Close() lr := io.LimitReader(resp.Body
resp, err := http.Client.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
lr := io.LimitReader(resp.Body, 1e+6)
b := make([]byte, 1e+6)
_, err := lmtdR.Read(b)
if err != nil {
return nil, err
}
上述方法失败了。但是如果我这样做
resp, err := http.Client.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
lr := io.LimitReader(resp.Body, 1e+6)
bdy, err := ioutil.ReadAll(lr)
if err != nil {
return nil, err
}
这很有效。所以我有一个解决方案,但我真的想知道我在第一个例子中做错了什么。任何帮助都将不胜感激。引用以下文件:
Read最多可将len(p)字节读入p
无法保证Read()
将填充传递的切片,即使其源中有足够的数据。实现可以自由地读取更少的字节并返回“早”,通常是在读取更多字节会阻塞的情况下。如果有可能Read()
从其源读取“一切”,它可能会返回EOF以表示无法读取更多数据。这就是你所经历的
另一方面,它保证继续读取或等待,直到读取器返回错误或报告EOF。还请注意,如果源读取器一直读取到EOF,则
ioutil.ReadAll()
将不会返回EOF,而是nil
错误,因为在ReadAll()
TL的情况下,直到EOF的读取不被视为错误(但成功);DR始终从文档开始
区别在于语义:
io.Reader.Read
:
~$go doc io.Reader
包io//导入“io”
类型读取器接口{
读取(p[]字节)(n int,err error)
}
Reader
是封装基本Read
方法的接口
Read
最多可将len(p)
字节读入p
。
它返回读取的字节数(
0Read
当它到达流的末尾时返回io.EOF
。这并没有失败,这就是读取的工作方式。使用后一个版本,因为在不需要的时候,你不需要分配整个片段。我一定已经阅读了大约一百次文档……但是你的解释让我明白了。就像我一样说得很明显:)谢谢!@FailOver,顺便说一句,不要低估源代码的可用性;-)通常,窥探实现会有所帮助。在的文档中,可以直接从文档页面获取源。我的意思是,您可能有兴趣了解一下io/ioutil.ReadAll
是如何实现的。