是否有一个版本ioutil.ReadAll会读取直到到达 EOF 或读取n字节(以先到者为准)?由于 DOS 原因,我不能只n从ioutil.ReadAll转储中获取第一个字节。
3 回答
富国沪深
TA贡献1790条经验 获得超9个赞
有几种方法可以满足您的要求。您可以使用任何一种。
func ReadFull(r Reader, buf []byte) (n int, err error)
ReadFull 将 len(buf) 字节从 r 准确读取到 buf 中。如果读取的字节数较少,则返回复制的字节数和错误。仅当未读取字节时,错误才为 EOF。
func LimitReader(r Reader, n int64) Reader
LimitReader 返回一个从 r 读取但在 n 个字节后以 EOF 停止的 Reader。底层实现是一个*LimitedReader。
func CopyN(dst Writer, src Reader, n int64) (written int64, err error)
CopyN 将 n 个字节(或直到出现错误)从 src 复制到 dst。它返回复制的字节数和复制时遇到的最早错误。返回时,写 == n 当且仅当 err == nil。
func ReadAtLeast(r Reader, buf []byte, min int) (n int, err error)
ReadAtLeast 从 r 读取到 buf 中,直到读取至少 min 个字节。如果读取的字节数较少,则返回复制的字节数和错误。仅当未读取字节时,错误才为 EOF。
holdtom
TA贡献1805条经验 获得超10个赞
有两种选择。Ifn
是您要读取的字节数,r
是连接。
选项1:
p := make([]byte, n) _, err := io.ReadFull(r, p)
选项 2:
p, err := io.ReadAll(&io.LimitedReader{R: r, N: n})
如果应用程序通常填充缓冲区,则第一个选项更有效。
如果您正在读取 HTTP 请求正文,请使用http.MaxBytesReader。
慕容708150
TA贡献1831条经验 获得超4个赞
io.ReadFull 或 io.LimitedReader 或 http.MaxBytesReader。
如果你需要一些不同的东西,首先看看它们是如何实现的,用调整过的行为来推出你自己的东西是微不足道的。
- 3 回答
- 0 关注
- 546 浏览
添加回答
举报
0/150
提交
取消