最近,我使用golang Read(p []byte),打算读取完整的len(p)字节。但是我发现Read不能保证读取len(p)字节。也就是说,我需要读取4个字节,但实际上它只给我1个字节。最后我改用io.ReadFull

现在我很困惑,函数的含义是什么?使用Read的正确场景是什么?它读取的字节可能比您需要的少。

最佳答案

如果查看文档和源代码,您将了解为什么 bufio.Read(p []byte) 无法保证将数据完全读取到p Reader中。

读取将数据读入p。它返回读入p的字节数。
这些字节是从底层Reader上的最多Read中获取的,
因此n可能小于len(p)。

从源代码复制,在函数末尾有一个copy操作,其中缓冲区被复制到字节数组中。但这不能保证复制完整的数据块。

// copy as much as we can
n = copy(p, b.buf[b.r:b.w]) // => this line is important
b.r += n
b.lastByte = int(b.buf[b.r-1])
b.lastRuneSize = -1
return n, nil

如果要复制字节的完整长度,请使用 bufio.ReadBytes 代替,根据使用情况,使用EOFEOL分隔符作为参数。

07-24 09:37
查看更多