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

ajo*_*eps 7 string stringbuilder go

// Reset resets the Builder to be empty.
func (b *Builder) Reset() {
    b.addr = nil
    b.buf = nil
}
Run Code Online (Sandbox Code Playgroud)

代码片段来自go strings.Builder中的源代码。缓冲区设置nil为而不是b.buf[:0]nil将其设置为而不保留容量的原因是什么?

编辑: 我可以看到它Reset()可以用于 GC 底层缓冲区并允许重新使用 Builder 结构,但初始化该结构似乎是边际成本,因为它只是两个指针,而底层数组可能是更大,并且可以重复使用。我觉得应该有一个Clear()函数可以保留底层缓冲区的容量,但将其长度减少到 0,而且实现起来很简单。这让我相信没有这样做是有原因的,我很好奇这个原因是什么。

tom*_*asz 6

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

// String returns the accumulated string.
func (b *Builder) String() string {
    return *(*string)(unsafe.Pointer(&b.buf))
}
Run Code Online (Sandbox Code Playgroud)

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

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