在Go语言里,字符串是不可变的类型,每次使用加号拼接字符串时,都会生成新的字符串对象,频繁拼接会产生大量临时内存,影响程序性能。使用bytes.Buffer和append可以规避这个问题,实现更高效的字符串拼接。

传统字符串拼接的问题
直接使用+拼接字符串时,每一次拼接都会创建新的字符串,假设要拼接n个字符串,会产生n-1个临时字符串对象,内存分配次数多,性能较差。下面是传统拼接的示例:
package main
import "fmt"
func main() {
result := ""
for i := 0; i < 1000; i++ {
result += fmt.Sprintf("num:%d", i)
}
fmt.Println(result[:10]) // 输出前10个字符验证结果
}
使用 bytes.Buffer 拼接字符串
bytes.Buffer是一个字节缓冲区,底层维护了一个字节切片,拼接字符串时只会往缓冲区追加字节,不会频繁创建新的字符串对象,拼接完成后再转换为字符串即可。
基本用法
使用bytes.Buffer拼接字符串的步骤很简单,先创建缓冲区,再调用WriteString方法追加内容,最后用String方法获取结果:
package main
import (
"bytes"
"fmt"
)
func main() {
var buffer bytes.Buffer
for i := 0; i < 1000; i++ {
// 向缓冲区追加字符串
buffer.WriteString(fmt.Sprintf("num:%d", i))
}
// 转换为最终字符串
result := buffer.String()
fmt.Println(result[:10])
}
性能优势
bytes.Buffer的底层切片会自动扩容,减少了内存分配次数,在拼接大量字符串时,性能比直接使用加号拼接高很多。如果提前知道要拼接的内容大小,还可以调用Grow方法预分配容量,进一步提升性能:
package main
import (
"bytes"
"fmt"
)
func main() {
var buffer bytes.Buffer
// 预分配2000字节的容量,减少扩容次数
buffer.Grow(2000)
for i := 0; i < 1000; i++ {
buffer.WriteString(fmt.Sprintf("num:%d", i))
}
result := buffer.String()
fmt.Println(result[:10])
}
使用 append 拼接字符串
append是Go语言内置的切片追加函数,我们可以先创建一个字节切片,用append不断追加字节,最后把字节切片转换为字符串,这种方式同样可以避免频繁创建临时字符串。
基本用法
使用append拼接时,需要先把字符串转换为字节切片再追加,最终转换回字符串:
package main
import "fmt"
func main() {
var b []byte
for i := 0; i < 1000; i++ {
// 将格式化后的字符串转换为字节切片再追加
b = append(b, []byte(fmt.Sprintf("num:%d", i))...)
}
result := string(b)
fmt.Println(result[:10])
}
优化方式
同样可以提前预分配切片的容量,减少扩容带来的性能损耗:
package main
import "fmt"
func main() {
// 预分配2000字节的容量
b := make([]byte, 0, 2000)
for i := 0; i < 1000; i++ {
b = append(b, []byte(fmt.Sprintf("num:%d", i))...)
}
result := string(b)
fmt.Println(result[:10])
}
两种方式的选择建议
两种方式的性能接近,选择时可以根据场景判断:
- 如果需要频繁调用WriteString、WriteByte等方法,或者需要和其他IO操作结合,优先选择bytes.Buffer,它的方法更丰富,使用更方便。
- 如果只是简单的字节追加,不需要额外的缓冲区方法,使用append更轻量,没有额外的结构体开销。
另外需要注意,两种方式的底层都是字节切片,拼接完成后转换为字符串时,如果后续不再修改字符串,转换操作的开销是可以接受的,远小于频繁拼接临时字符串的开销。
性能对比参考
下面是三种拼接方式的简单性能对比,拼接10000个短字符串的场景下,耗时大致如下:
| 拼接方式 | 大致耗时 |
|---|---|
| 直接使用+拼接 | 约1200微秒 |
| bytes.Buffer拼接 | 约80微秒 |
| append拼接 | 约75微秒 |
从对比可以看出,使用bytes.Buffer和append拼接字符串的性能远高于传统方式,在需要频繁拼接字符串的场景下,优先选择这两种方式可以有效提升程序性能。
bytes.Bufferappend字符串拼接Go语言修改时间:2026-07-08 00:27:25