Go 读取http.Body时io.LimitReader 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

这对某些人来说可能是非常明显的,但我需要一点帮助,看看我哪里出了问题。 我试图使用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, 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

它返回读取的字节数(
0
Read
当它到达流的末尾时返回
io.EOF
。这并没有失败,这就是读取的工作方式。使用后一个版本,因为在不需要的时候,你不需要分配整个片段。我一定已经阅读了大约一百次文档……但是你的解释让我明白了。就像我一样说得很明显:)谢谢!@FailOver,顺便说一句,不要低估源代码的可用性;-)通常,窥探实现会有所帮助。在的文档中,可以直接从文档页面获取源。我的意思是,您可能有兴趣了解一下
io/ioutil.ReadAll
是如何实现的。