- 常见的 “+” 拼接
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-原理解析