golang Read(p [] byte)不读取完整字节?

时间:2016-09-30 04:23:37

标签: go io

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

现在我很困惑,这个功能有什么意义?什么是使用Read的正确场景?它可能只读取比您需要的更少的字节。

1 个答案:

答案 0 :(得分:0)

如果您查看文档和源代码,您将会发现为什么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分隔符作为参数,具体取决于您的使用情况。