我有:
var buffer bytes.Buffer
s := "something to do"
for i := 0; i < 10; i++ {
buffer.WriteString(s)
}
哪个附加到缓冲区,是否可以写入缓冲区的开头?
答案 0 :(得分:4)
由于基础buf
未从bytes.Buffer
导出,您可以使用:
buffer.WriteString("B")
s := buffer.String()
buffer.Reset()
buffer.WriteString("A")
buffer.WriteString(s)
试试这个The Go Playground:
package main
import (
"bytes"
"fmt"
)
func main() {
var buffer bytes.Buffer
buffer.WriteString("B")
s := buffer.String()
buffer.Reset()
buffer.WriteString("A" + s)
fmt.Println(buffer.String())
}
输出:
AB
答案 1 :(得分:3)
无法插入,请参阅Amd的“解决方法”的答案。要在开始时覆盖覆盖内容,请继续阅读。
请注意,不会导出内部字节片Buffer.buf
,但方法Buffer.Bytes()
将返回与Buffer.buf
内部片共享相同后备阵列的片。
这意味着如果您通过调用bytes.Buffer
创建新的Bytes.NewBuffer()
,并在重新之后将此切片传递给零长度并保留容量,则可以写入开头缓冲区,覆盖第一个缓冲区的原始数据。
见这个例子:
buf := &bytes.Buffer{}
buf.WriteString("Hello World")
fmt.Println("buf:", buf)
buf2 := bytes.NewBuffer(buf.Bytes()[:0])
buf2.WriteString("Gopher")
fmt.Println("buf:", buf)
fmt.Println("buf2:", buf2)
输出(在Go Playground上尝试):
buf: Hello World
buf: Gopher World
buf2: Gopher
注意:使用此技术,您还可以通过使用所需索引而不是0
重新传递并传递切片来覆盖任意位置的内容。例如:
buf := &bytes.Buffer{}
buf.WriteString("Hello World")
fmt.Println("buf:", buf)
buf2 := bytes.NewBuffer(buf.Bytes()[6:6]) // Start after the "Hello"
buf2.WriteString("Gopher")
fmt.Println("buf:", buf)
fmt.Println("buf2:", buf2)
输出(在Go Playground上尝试):
buf: Hello World
buf: Hello Gopher
buf2: Gopher
请注意,通过Buffer.Bytes()
返回的切片对内容的“操纵”可能只有在修改Buffer
之后才会成功,之后Buffer
可能会分配新的支持数组和你拥有的数组将被“分离”(因此对它的进一步修改将不会反映在原始的Buffer
中):
切片仅在下一次缓冲区修改之前有效(即,直到下次调用Read,Write,Reset或Truncate等方法)。