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

// 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,而且实现起来很简单。这让我相信为什么没有这样做是有原因的,我很好奇这个原因是什么。


千巷猫影
浏览 170回答 3
3回答

慕后森

的优化之一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

汪汪一只猫

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

一只甜甜圈

如果Reset保留底层缓冲区,那么 long-livingBuilder将占用它所构建的最长字符串的内存。为最长字符串分配的数组将始终处于活动状态,即使其中大部分未被使用。将缓冲区设置为 nil 允许垃圾收集器收集这些潜在的大缓冲区。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go