写入Golang缓冲区的开头?

时间:2016-10-25 05:07:11

标签: go

我有:

var buffer bytes.Buffer
s := "something to do"
for i := 0; i < 10; i++ {
   buffer.WriteString(s)
}

哪个附加到缓冲区,是否可以写入缓冲区的开头?

2 个答案:

答案 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等方法)。