Golang中如何直接将io.Reader数据复制到bytes.Buffer?
直接将io.Reader数据写入bytes.Buffer的最优方式
你可以直接调用bytes.Buffer的ReadFrom方法替代io.Copy,这个方法会直接利用bytes.Buffer自身的内部缓冲区接收数据,无需额外创建中间缓存。
为什么io.Copy会产生中间缓冲区?
io.Copy的默认逻辑是创建一个临时缓冲区(默认32KB),先从读取器读数据到这个临时缓存,再写入目标写入器。但如果目标写入器实现了io.ReaderFrom接口,io.Copy会直接调用该接口的ReadFrom方法——而bytes.Buffer正好实现了这个接口。
代码示例
把原来的代码:
_, err := io.Copy(dstBytesBuffer, reader)
替换为:
_, err := dstBytesBuffer.ReadFrom(reader)
原理说明
bytes.Buffer.ReadFrom的内部逻辑是直接用自身底层字节切片的空闲区域接收读取器数据:
- 检查当前缓冲区的空闲空间,不足时自动扩容
- 直接将读取器的数据读入缓冲区的空闲切片段
- 更新缓冲区长度,完成写入
这个过程完全跳过了额外的中间缓冲区,直接将数据从读取器复制到目标缓冲区的内存空间,效率更高。
内容的提问来源于stack exchange,提问作者bieno002
相关产品推荐
相关产品推荐

