# 1. 使用 + 拼接字符串(小规模拼接场景)

当字符串拼接操作较少时,直接使用 + 操作符即可

s := "hello" + "world"
fmt.Println(s) // helloworld

# 2. 使用 strings.Builder 拼接字符串

strings.Builder 是一个用于高效拼接字符串的缓冲区,减少了不必要的内存分配和拷贝,当字符串拼接操作较多时,使用 strings.Builder 可以提高性能

var builder strings.Builder
builder.WriteString("hello")
builder.WriteString("world")
fmt.Println(builder.String()) // helloworld

# 3. 使用 bytes.Buffer 拼接字符串

bytes.Buffer 是另一个用于字符串拼接的工具,适用于需要处理字节切片([] byte)的场景。

var buffer bytes.Buffer
buffer.WriteString("hello")
buffer.WriteString("world")
fmt.Println(buffer.String()) // helloworld

对比 string.Builder:

  • bytes.Buffer 可以直接写入字节切片,而 strings.Builder 只能写入字符串
  • 如果只操作字符串,使用 strings.Builder 更为方便

# 4. 使用 fmt.Sprintf 拼接字符串

当字符串拼接操作较多时,使用 fmt.Sprintf 也可以提高性能

s := fmt.Sprintf("hello%s", "world")
fmt.Println(s) // helloworld

优点:

  • 支持复杂的格式化
    缺点:
  • 性能不如 strings.Builder 和 bytes.Buffer,不推荐用于频繁拼接

# 5. 性能对比与选择指南 🚀

方法 性能 优点 缺点 适用场景 内存分配
+ 操作符 🔴 较差 ・代码简洁直观
・适合简单连接
・编译器有小规模优化
・每次操作都会分配新内存
・多次操作性能下降明显
・简单的字符串连接
・编译期可确定的拼接
・少量(2-3 个)字符串拼接
频繁分配新内存
strings.Builder 🟢 最佳 ・内存复用,性能最优
・预分配内存
・专注字符串操作
・只能操作字符串
・需要最后调用 String () 转换
・大量字符串拼接
・循环中的字符串构建
・性能关键场景
仅在扩容时分配
bytes.Buffer 🟡 良好 ・功能最全面
・支持多种数据类型
・可读可写
・比 Builder 略慢
・额外功能导致开销增加
・混合数据类型处理
・需要读写操作
・处理二进制数据
初始化和扩容时分配
fmt.Sprintf 🔴 较差 ・格式化功能强大
・支持各种数据类型
・代码可读性好
・性能开销大
・每次调用都有内存分配
・需要复杂格式化
・类型转换场景
・开发调试阶段
每次调用都分配

# 选择建议 💡

  1. 小规模拼接(2-3 个字符串):

    str := "hello" + "world" + "!"
  2. 大规模拼接(循环或大量字符串):

    var builder strings.Builder
    builder.Grow(n) // 预分配内存
    for i := 0; i < n; i++ {
        builder.WriteString(strs[i])
    }
    result := builder.String()
  3. 混合类型处理

    var buffer bytes.Buffer
    buffer.WriteString("字符串")
    buffer.Write([]byte("字节切片"))
    buffer.WriteByte('!')
    result := buffer.String()
  4. 格式化需求

    result := fmt.Sprintf("Hello, %s! Count: %d", name, count)
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

ZJM 微信支付

微信支付

ZJM 支付宝

支付宝