
Go 标准库的 bytes.Buffer 默认只支持追加写入,不直接提供“写入开头”的方法;但可通过重置缓冲区并拼接字符串的方式实现前置插入。
go 标准库的 `bytes.buffer` 默认只支持追加写入,不直接提供“写入开头”的方法;但可通过重置缓冲区并拼接字符串的方式实现前置插入。
bytes.Buffer 是一个高效、可变长度的字节缓冲区,其底层使用切片([]byte)存储数据,但关键字段 buf 是未导出的,因此无法直接操作内部字节切片实现前插。官方 API 仅暴露了 WriteString、Write、WriteByte 等追加型方法,没有 PrependString 或类似接口。
不过,我们可以通过“读取当前内容 → 清空缓冲区 → 先写入新内容 → 再写入原内容”的三步策略,模拟前置写入效果。例如:
package main
import (
"bytes"
"fmt"
)
func main() {
var buffer bytes.Buffer
buffer.WriteString("something to do")
// 模拟向开头写入 "START: "
original := buffer.String()
buffer.Reset()
buffer.WriteString("START: " + original)
fmt.Println(buffer.String())
// 输出:START: something to do
}
若需多次前置插入(如构建日志前缀链),可封装为辅助函数:
func PrependString(b *bytes.Buffer, s string) {
content := b.String()
b.Reset()
b.WriteString(s + content)
}
// 使用示例
var buf bytes.Buffer
buf.WriteString("world")
PrependString(&buf, "hello ")
PrependString(&buf, "[INFO] ")
fmt.Println(buf.String()) // 输出:[INFO] hello world
⚠️ 注意事项:
- 该方法会触发一次内存拷贝(
String()转string+ 字符串拼接),对超大缓冲区(如 MB 级)可能影响性能; - 若追求极致性能且需高频前后插入,建议改用
list.List(双向链表)或自定义结构体,或考虑strings.Builder(仅适用于纯字符串且不支持前插); -
buffer.Reset()安全清空内容并复用底层数组,比buffer = bytes.Buffer{}更高效。
总结:虽然 bytes.Buffer 不原生支持前置写入,但通过 String() + Reset() + 重组的组合方式,能简洁、安全、符合 Go 惯用法地实现该需求,适用于绝大多数常规场景。










