是否有ioutil.ReadAll
的版本在读取到EOF之前读取,或者如果它读取n
个字节(以先到者为准)?
出于DOS原因,我不能从n
转储中获取第一个ioutil.ReadAll
字节。
答案 0 :(得分:2)
有几种方法可以满足您的要求。你可以使用任何一个。
func ReadFull(r Reader, buf []byte) (n int, err error)
ReadFull从r读取正好len(buf)个字节到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。
答案 1 :(得分:1)
io.ReadFull 要么 io.LimitedReader 要么 http.MaxBytesReader
如果您需要先了解一些不同的东西,那么通过调整行为来推动自己的实施是微不足道的。
答案 2 :(得分:1)
有两种选择。如果n
是您要读取的字节数,则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。