四川省住房和城乡建设厅网站发wordpress中文官网
- 作者: 五速梦信息网
- 时间: 2026年04月20日 08:27
当前位置: 首页 > news >正文
四川省住房和城乡建设厅网站发,wordpress中文官网,手机网站制作合同,北京远程时代网站建设Go的bytes.Buffer 文章目录Go的bytes.Buffer一、bytes.Buffer 的基础知识二、bytes.Buffer类型的值#xff0c;已读计数的作用三、bytes.Buffer的扩容策略四、bytes.Buffer的哪些方法会造成内容的泄露一、bytes.Buffer 的基础知识
与strings.Builder一样#xff0c;bytes.Bu…Go的bytes.Buffer 文章目录Go的bytes.Buffer一、bytes.Buffer 的基础知识二、bytes.Buffer类型的值已读计数的作用三、bytes.Buffer的扩容策略四、bytes.Buffer的哪些方法会造成内容的泄露一、bytes.Buffer 的基础知识
与strings.Builder一样bytes.Buffer也是开箱即用的。
bytes.Buffer类型的用途主要是作为字节序列的缓冲区。
在内部bytes.Buffer类型使用字节切片作为内容容器并有一个int类型的字段作为已读计数这个已读计数无法通过bytes.Buffer提供的方法计算出来。 var buffer1 bytes.Buffercontents : Simple byte buffer for marshaling data// Write contents Simple byte buffer for marshaling datafmt.Printf(Write contents %q\n, contents)buffer1.WriteString(contents)// The length of buffer: 38fmt.Printf(The length of buffer: %d\n, buffer1.Len())// The capacity of buffer: 64fmt.Printf(The capacity of buffer: %d\n, buffer1.Cap())与strings.Reader类型的Len方法一样buffer1的Len方法返回的也是内容容器中未被读取部分的长度而不是其中已存内容的总长度。 Buffer 值的长度是未读内容的长度而不是已读内容的长度。 p1 : make([]byte, 7)n, _ : buffer1.Read(p1)// 7 bytes were read. (call Read)fmt.Printf(%d bytes were read. (call Read)\n, n)// The length of buffer: 31fmt.Printf(The length of buffer: %d\n, buffer1.Len())// The capacity of buffer: 64fmt.Printf(The capacity of buffer: %d\n, buffer1.Cap())Buffer值的容量是它的内容容器也就是那个字节切片的容量它只与当前值之上的写操作有关并随着内容的写入而不断增长。
二、bytes.Buffer类型的值已读计数的作用 读取内容时相应方法会依据已读计数找到未读内容并在读取之后更新计数 相应方法包括所有名称以Read开头的方法以及Next方法和WriteTo方法。 写入内容时如需扩容相应方法会根据已读计数实现扩容策略 写入时如果没有足够的容量就会对容器进行扩容。 扩容时方法会在必要时依据已读计数找到未读部分并把其中的内容拷贝到扩展容器的头部位置。然后方法会把已读计数值置为0。 相应方法包括所有名称以Write开头的方法以及ReadFrom方法。 截断内容时相应方法截断的时已读计数代表索引之后的未读部分 截断方法Truncate接受一个int类型的参数表示在截断时需要保留头部多少个字节。 这里的头部是未读部分的头部而不是内容容器的头部。 这种情况下已读计数的值再加上参数值后得到的和就是内容容器新的总长度。 读回退时相应方法会使用已读计数记录回退点 用于读回退的方法有UnreadByte和UnreadRune。这两个方法分别用于回退一个字节和回退一个Unicode字符。 回退的前提是在调用它们之前的那一个操作必须是“读取”并且是成功的读取否则这些方法就只会忽略后续操作并返回一个非nil的错误值。 只有紧挨在调用ReadRune 方法之后对UnreadRune方法对调用才能够成功完成。 重置内容时相应方法会把已读计数置为0 导出内容时相应方法只会导出已读计数代表的索引之后的未读部分 Buffer值的Bytes和String方法只会访问未读部分的内容并返回相应的结果值。 获取长度时相应方法会依据已读计数和内容容器的长度计算未读部分的长度并返回 Buffer值的Len方法返回的是内容容器未读部分的长度。
三、bytes.Buffer的扩容策略
bytes.Buffer既可以手动扩容也可以自动扩容。除非完全确定后续内容所需的字节数否则让Buffer自动扩容就好了。这两种方式的扩容策略一样。
扩容策略 判断内容容器的剩余容量是否满足调用方的要求是否足够容纳新的内容 如果剩余容量满足容纳新的内容就在当前的内容容器之上进行长度扩容 buf buf[:lengthneed]如果剩余容量不满足容纳新的内容就会用新的内容容器去替代原有的内容容器从而实现扩容 这里有一个优化如果当前内容容器的容量的一半仍然大于或等于现有长度即未读字节数再加上另需字节数的和即
cap(buf)/2 len(buf) need那么扩容代码就会复用现有的内容容器并把容器中的未读内容拷贝到它的头部位置。
这意味着其中的已读内容将会全部被未读内容和之后的新内容覆盖掉。 如果当前内容容器的容量小于新长度的二倍。这时就会把原有容器中的未读内容拷贝进去最后再用新的容器替换掉原有的容器。这个新容器将会等于原有容量的二倍再加上另需字节数的和。 新容器的容量 原有容量 * 2 所需字节数扩容还会把已读计数置为0。 对于处于零值状态的Buffer值来说如果第一次扩容时另需的字节数小于等于64那么该值就会基于一个预先定义好的、长度为64的字节数组来创建内容容器。 这种情况下容器的容量就是64。这样做的目的是为了让Buffer值在刚被真正使用的时候可以快速的做好准备。
四、bytes.Buffer的哪些方法会造成内容的泄露
这里的内容泄露是指使用Buffer值的一方通过某种非标准的方式得到本不该得到的内容。
在bytes.Buffer中Bytes方法和Next方法都有可能会造成内容的泄露。原因在于它们都把基于内容容器的切片直接返回给了方法的调用方。
通过切片我们可以直接访问和操纵它们的底层数组不论这个切片是基于某个数组得来的还是痛哦过对另一个切片做切片操作获得的都是如此。
bytes.Buffer的Bytes方法和Next方法返回的字节切片都是通过对内容容器的切片做切片操作得到的。 contents : abbuffer1 : bytes.NewBufferString(contents)// The capacity of new buffer with contents ab: 8// 容量为何为8看 runtime/string.go#stringtoslicebyte()fmt.Printf(The capacity of new buffer with contents %q: %d\n, contents, buffer1.Cap())unreadBytes : buffer1.Bytes()// The unread bytes of the buffer: [97 98]fmt.Printf(The unread bytes of the buffer: %v\n, unreadBytes)buffer1.WriteString(cdefg)// The capacity of new buffer with contents ab: 8fmt.Printf(The capacity of new buffer with contents %q: %d\n, contents, buffer1.Cap())unreadBytes unreadBytes[:cap(unreadBytes)]// 基于前面的内容获取到结果值// The unread bytes of the buffer: [97 98 99 100 101 102 103 0]fmt.Printf(The unread bytes of the buffer: %v\n, unreadBytes)// 操纵bufferunreadBytes[len(unreadBytes)-2] byte(X)// The unread bytes of the buffer: [97 98 99 100 101 102 88 0]fmt.Printf(The unread bytes of the buffer: %v\n, unreadBytes)
- 上一篇: 四川省中国建设银行招聘信息网站铁岭做网站包括哪些
- 下一篇: 四川省住房建设厅网站app开发哪个公司好
相关文章
-
四川省中国建设银行招聘信息网站铁岭做网站包括哪些
四川省中国建设银行招聘信息网站铁岭做网站包括哪些
- 技术栈
- 2026年04月20日
-
四川省微信网站建设公做网站的成本费用
四川省微信网站建设公做网站的成本费用
- 技术栈
- 2026年04月20日
-
四川省建设招标网站首页网络工具
四川省建设招标网站首页网络工具
- 技术栈
- 2026年04月20日
-
四川省住房建设厅网站app开发哪个公司好
四川省住房建设厅网站app开发哪个公司好
- 技术栈
- 2026年04月20日
-
四川石油天然气建设工程有限责任公司网站企业网站制作策划书
四川石油天然气建设工程有限责任公司网站企业网站制作策划书
- 技术栈
- 2026年04月20日
-
四川市网站建设视频弹幕网站怎么做的
四川市网站建设视频弹幕网站怎么做的
- 技术栈
- 2026年04月20日
