最近,我使用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
代替,根据使用情况,使用EOF
或EOL
分隔符作为参数。