Golang 字符串拼接

引入

  • Golang中的string类型是只读且不可变的。因此通过循环字符串切片拼接字符串的方式会导致大量的string创建、销毁和内存分配

通过bytes.Buffer优化

  • 使用var bs bytes.Buffer存放最终拼接好的字符串,一定程度上避免了string没进行一次拼接都重新申请内存空间的问题
  • 但依然存在一个问题:最终byte数组强转string,同样需要进行一次内存分配和内容拷贝
func (b *Buffer) String() string {
	if b == nil {
		// Special case, useful in debugging.
		return "<nil>"
	}
	return string(b.buf[b.off:])
}

通过strings.Builder优化

  • 优化一:针对最终byte数组转换string进行优化,使用了一个unsafe.Pointer的内存指针转换操作,避免了内存分配的问题
func (b *Builder) String() string {
	return *(*string)(unsafe.Pointer(&b.buf))
}
  • 优化二:通过copyCheck()来保证Builder对象被赋值后不可修改,来避免byte数组逃逸到堆上
func (b *Builder) copyCheck() {
	if b.addr == nil {
		b.addr = (*Builder)(noescape(unsafe.Pointer(b)))
	} else if b.addr != b {
		panic("strings: illegal use of non-zero Builder copied by value")
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值