社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
golang(go1.12.9) 的标准包bytes.Buffer,是一个简单的字节(byte) 缓冲buffer,
定义了一个默认的最小容量smallBufferSize = 64,实现了byte的读,写,清空等操作,
其中写操作稍微麻烦,需要考虑扩容的情形,下面主要分析一下buffer 扩容
type Buffer struct {
buf []byte // contents are the bytes buf[off : len(buf)]
off int // read at &buf[off], write at &buf[len(buf)]
lastRead readOp // last read operation, so that Unread* can work correctly.
}
buf : byte 切片,用来存储实际的数据,
off: 即offset 读操作的偏移地址
lastRead : 记录上一次的读操作类型
由此可以得出:
扩容原则:
当slice的数据长度小于容量一半时,不扩容,反之,则容量扩大为原来的2倍
1.如果 L + n < c 时,这时slice不需要扩容,(参考源码 tryGrowByReslice 函数)
2.当 L+n >= c 时, (参考源码 grow(n) 函数)需要分两种情况讨论
2.1 如果写入数据之后buffer的长度小于slice容量的一半时 ,也就是m+n < c/2 时,
此时我们用copy移动一下buffer的数据,再更新读的偏移量即可
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!