我有:
var buffer bytes.Buffer
s := "something to do"
for i := 0; i < 10; i++ {
buffer.WriteString(s)
}哪个附加到缓冲区,是否可以写入缓冲区的开头?
发布于 2016-10-25 05:15:53
由于基础buf不是从bytes.Buffer导出的,所以可以使用:
buffer.WriteString("B")
s := buffer.String()
buffer.Reset()
buffer.WriteString("A")
buffer.WriteString(s)试试这个围棋游乐场
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发布于 2016-10-25 07:51:54
插入到开头是不可能的,见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)输出(在围棋游乐场上尝试):
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)输出(在围棋游乐场上尝试):
buf: Hello World
buf: Hello Gopher
buf2: Gopher请注意,通过Buffer.Bytes()返回的切片对内容的“操作”只有在修改Buffer之后才能成功,在此之后,Buffer有可能分配一个新的支持数组,并且您拥有的那个数组将被“分离”(因此对它的进一步修改不会反映在原始Buffer中):
该片只能在下一次缓冲区修改之前使用(也就是说,直到下一次调用方法(如读、写、重置或截断)为止)。
https://stackoverflow.com/questions/40231761
复制相似问题