Golang三种字符串拼接方式与优劣

  • 常见的 “+” 拼接
	sli := []string{
		"aa",
		"bb",
		"cc",
	}
	var str string
	for _, s := range sli {
		str += s
	}
	fmt.Println("string:", str)

golang中的string类型也是只读且不可变的。因此,这种字符串拼接的方式会导致大量的string创建、随会和内存分配。如果拼接字符串比较多的话,不推荐该种写法。

  • 在golang 1.10以前,利用bytes.Buffer来优化字串拼接
	sli := []string{
		"aa",
		"bb",
		"cc",
	}
	var bs bytes.Buffer
	for _, s := range sli {
		bs.WriteString(s)
	}
	fmt.Println("bs:", bs.String())

使用var bs bytes.Buffer存放拼接好的字符串,一定层度上避免每使用一次 “+” 拼接,就会操作重新申请内存空间存储中间字符串的问题。

但最后使用bs.String() 还是会有一次[]byte 转换为string的操作,而这个操作也会进行一次内存分配和内容拷贝。

  • 在golang 1.10,提供strings.Builder
	sli := []string{
		"aa",
		"bb",
		"cc",
	}
	var bs strings.Builder
	for _, s := range sli {
		bs.WriteString(s)
	}
	fmt.Println("bs:", bs.String())

为了解决bytes.Buffer.String()存在的[]byte -> string类型转换和内存拷贝问题,strings.Builder源码使用了一个unsafe.Pointer的存指针转换操作,实现了直接将buf []byte转换为 string类型,同时避免了内存充分配的问题。

参考:https://liudanking.com/performance/golang-strings-builder-原理解析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值