为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 string.Builder Reset() 不保留底层缓冲区?

为什么 string.Builder Reset() 不保留底层缓冲区?

Go
千巷猫影 2022-06-01 15:54:16
// Reset resets the Builder to be empty.func (b *Builder) Reset() {    b.addr = nil    b.buf = nil}代码片段来自go strings.Builder中的源代码。缓冲区设置为nil而不是b.buf[:0]. 将其设置为nil而不是保留容量的原因是什么?编辑: 我可以看到它Reset()可用于 GC 底层缓冲区并允许重新使用 Builder 结构,但初始化结构似乎是边际成本,因为它只是两个指针,而底层数组可能是更大,并且可以重复使用。我觉得应该有一个Clear()函数可以保持底层缓冲区的容量但将其长度减少到 0,而且实现起来很简单。这让我相信为什么没有这样做是有原因的,我很好奇这个原因是什么。
查看完整描述

3 回答

?
慕后森

TA贡献1802条经验 获得超5个赞

的优化之一strings.Builder是它在转换[]byte为string. 看一下它的String()方法:


// String returns the accumulated string.

func (b *Builder) String() string {

    return *(*string)(unsafe.Pointer(&b.buf))

}

这意味着重用缓冲区会破坏以前创建的字符串。


这是操场上的证明:https: //play.golang.org/p/gkSXRwi0-Ff


查看完整回答
反对 回复 2022-06-01
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

要点Reset()是进入Builder初始空状态(如创建新状态时)。

这样做而不是获取新组件的好处Builder是,当您的程序的其他组件持有对现有组件的引用Builder并且您想要将其“重置”到初始状态而不用新引用刷新所有这些组件时。


查看完整回答
反对 回复 2022-06-01
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

如果Reset保留底层缓冲区,那么 long-livingBuilder将占用它所构建的最长字符串的内存。为最长字符串分配的数组将始终处于活动状态,即使其中大部分未被使用。将缓冲区设置为 nil 允许垃圾收集器收集这些潜在的大缓冲区。



查看完整回答
反对 回复 2022-06-01
  • 3 回答
  • 0 关注
  • 169 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信