3 回答

TA贡献1786条经验 获得超11个赞
你的方法听起来基本正确。一些备注:
当您在 中找到第一个 nul 字节的索引时
data
,您不需要复制,只需截断切片:data[:idx]
。bytes.Index应该能够为您找到该索引。
还有
bytes.Replace
所以你不需要转换为字符串。

TA贡献2065条经验 获得超14个赞
该io.Reader文档说:
Read 将最多 len(p) 个字节读入 p。它返回读取的字节数 (0 <= n <= len(p)) 和遇到的任何错误。
如果应用程序中对 Read 的调用未读取 16 个字节,data则将有尾随零字节。使用读取的字节数从缓冲区中修剪零字节。
data := make([]byte, 16)
n, err := c.Read(data)
if err != nil {
// handle error
}
data = data[:n]
还有一个问题。无法保证 Read 会吸收对等方发送的所有“消息”。应用程序可能需要多次调用 Read 来获取完整的消息。
您在问题中提到了结尾。如果来自客户端的消息终止但换行,则使用bufio.Scanner从连接中读取行:
s := bufio.NewScanner(c)
if s.Scan() {
data = s.Bytes() // data is next line, not including end lines, etc.
}
if s.Err() != nil {
// handle error
}
- 3 回答
- 0 关注
- 331 浏览
添加回答
举报