1 回答

TA贡献1744条经验 获得超4个赞
该Conn.Read()方法是为了实现io.Reader,从任何字节源读取数据的通用接口[]byte。引用自 的文档Reader.Read():
Read 将最多 len(p) 个字节读入 p。
因此Read()最多读取len(p)字节,但由于您传递了一个nil切片,它不会读取任何内容(nil切片的长度为0)。请阅读链接的文档以了解Reader.Read()工作原理。
Reader.Read()没有分配一个缓冲区 ( []byte) 来存储读取的数据,你必须创建一个并传递它,例如:
var buf = make([]byte, 100)
n, err := conn.Read(buf)
// n is the number of read bytes; don't forget to check err!
不要忘记始终检查返回的数据,如果到达数据末尾error可能会返回io.EOF。的常规协定io.Reader.Read()还允许返回一些非nil错误(包括io.EOF)和一些读出的数据(n > 0)在同一时间。读取的字节数将在n,这意味着只有 的第一个n字节buf是有用的(换句话说:)buf[:n]。
您使用的其他示例bufio.Reader有效,因为您调用了Reader.ReadString()which 不需要[]byte参数。如果您使用了该bufio.Reader.Read()方法,您还必须传递一个非nil切片才能实际获取一些数据。
- 1 回答
- 0 关注
- 205 浏览
添加回答
举报