string - 为什么 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,而且实现起来很简单。这让我相信为什么没有这样做是有原因的,我很好奇这个原因是什么。
解决方案
的优化之一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
推荐阅读
- android - 升级到 Android Studio 3.4 后出现此错误
- java - 从 Thymeleaf 片段中读取 html 属性值
- vue.js - vue.config.js - 加载多个 .scss 文件以供全局使用
- wpf - EventTrigger 无法在 IsEnabledChanged 上触发
- javascript - Highcharts 对齐多个饼图
- php - add_action('delete_category') 事件 - 获取已删除类别的名称
- generics - 如何为某些类型共有的几个接口编写包装器类型
- angular - .type() 将不接受空字符串 cypress
- php - Ajax 确认只要求一个数据
- python - 提交 FileField 后文件始终为空