猿问

Golang 从 net.TCPConn 读取字节

是否有一个版本ioutil.ReadAll会读取直到到达 EOF 或读取n字节(以先到者为准)?

由于 DOS 原因,我不能只nioutil.ReadAll转储中获取第一个字节。


MMTTMM
浏览 547回答 3
3回答

富国沪深

有几种方法可以满足您的要求。您可以使用任何一种。函数读取完整func ReadFull(r Reader, buf []byte) (n int, err error)ReadFull 将 len(buf) 字节从 r 准确读取到 buf 中。如果读取的字节数较少,则返回复制的字节数和错误。仅当未读取字节时,错误才为 EOF。功能限制阅读器func LimitReader(r Reader, n int64) ReaderLimitReader 返回一个从 r 读取但在 n 个字节后以 EOF 停止的 Reader。底层实现是一个*LimitedReader。功能复制Nfunc 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

有两种选择。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

io.ReadFull 或 io.LimitedReader 或 http.MaxBytesReader。如果你需要一些不同的东西,首先看看它们是如何实现的,用调整过的行为来推出你自己的东西是微不足道的。
随时随地看视频慕课网APP

相关分类

Go
我要回答