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

标签 string go stringbuilder

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

最佳答案

strings.Builder 的优化之一是它在将[]byte 转换为string 时不复制字节。看一下它的 String() 方法:

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

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

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

关于string - 为什么 string.Builder Reset() 不保留底层缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61515086/

相关文章:

将 PSTR 转换为 PWSTR 并转义某些字符

map - 无法从 map 分配给结构成员

java - 如何将多行文件变成用控制字符分隔的单行文件

python - 将字符串文字中的双反斜杠替换为单反斜杠

javascript - 如何在 JavaScript 中构建/连接字符串?

go - 在Golang中导入C错误: cc1.exe: error: too many filenames given

go - Println 打印方括号但接口(interface)不是 slice

c# - StringBuilder 中的 system.outofmemoryexception

java - 如何立即返回 String Builder 对象作为 rdd ?或者将 String Builder 对象转换为 rdd?

c - 字符数组中包含空字符和排除空字符有什么区别?